التعامل مع تجزئته كلمات السر المخزنة كما varbinary في SQL Server و ASP الكلاسيكية
-
13-09-2019 - |
سؤال
كل شيء ،
آسف مقدما - أنا مبتدئ في معظم المواضيع أدناه (SQL, ASP).على أي حال...
لدي بسيط جدا ويب التطبيق الذي يتطلب من المستخدمين تسجيل الدخول باستخدام اسم المستخدم وكلمة المرور.
الواجهة الأمامية يخلق المملح SHA1 تجزئة كلمة المرور و المشاركات (جنبا إلى جنب مع اسم المستخدم) إلى صفحة ASP.
أن صفحة ASP يأخذ بيانات المكالمات إجراء مخزن في قاعدة بيانات SQL Server و يمر اسم مستخدم و كلمة المرور المجزأة;الإجراء المخزن يكتب المعلومات إلى المستخدمين الجدول.
كلمة المرور العمود نوع في الجدول varbinary.
بقدر ما استطيع ان اقول ، عندما ASP يحصل على كلمة المرور (كلمة المرور = الطلب.شكل("password")), انها سلسلة.
أستطيع أن 'خدعة' SQL Server في التعامل مع الأمر باعتباره varbinary إن إنشاء الاستعلام بهذه الطريقة:
الاستعلام = "EXEC sp_save_user @username='" & username & "', @كلمة السر=0 x" & كلمة المرور
IOW أنا أن يتبع أحد "0 x" إلى سلسلة كلمة مرور.
بيد أني قرأت أنه من أفضل الممارسات لاستخدام استعلام ذي معلمات:
E. g.:مجموعة objParam = objCommand.CreateParameter("@كلمة المرور",204, 1, 40, كلمة المرور)
ومع ذلك ، فشل هذا لأن المعلمة هي من المفترض أن تكون الثنائية (204) ، ولكن كلمة السر هي سلسلة.
كيف يمكنني تحويل مثل سلسلة "4a5e6a8d521ed487b81c91e131cf27e8dae9b783" إلى الثنائية في ASP ؟
شكرا جزيلا مقدما!
المحلول
أتذكر تلك الأيام عندما كنت باش رأسي على هذا النوع من الشيء.أقترح عليك الحصول على ترقية ASP.Net ولكن في الوقت البرمجية التالية (VBScript) ينبغي أن تفعل ما تريد:
<%
Dim result
main()
function main()
Dim userName : userName = "Martin"
Dim data : data = "4a5e6a8d521ed487b81c91e131cf27e8dae9b783"
Dim db: Set db = Server.CreateObject("ADODB.Connection")
db.Open "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=password1;Initial Catalog=Test;Data Source=(local)"
Dim cmd : Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = db
cmd.CommandText = "dbo.[sp_save_user]"
cmd.CommandType = 4
cmd.Parameters.Append cmd.CreateParameter("@UserName", 200, 1, 50, userName)
Dim bytes : bytes = stringToBinary(data)
cmd.Parameters.Append cmd.CreateParameter("@Password", 204, 1, LenB(bytes), bytes)
cmd.Execute()
db.Close
result = "done"
end function
function stringToBinary(str)
dim ahex
for i=0 to len(str) - 1 step 2
Dim strDigit1
Dim strDigit2
strDigit1 = Ucase(Mid(str, i+1, 1))
strDigit2 = Ucase(Mid(str, i+2, 1))
Dim byteDigit1
Dim byteDigit2
byteDigit1 = InStr("0123456789ABCDEF", strDigit1) - 1
byteDigit2 = InStr("0123456789ABCDEF", strDigit2) - 1
ahex = ahex & ChrB((byteDigit1 * 16) + byteDigit2)
next
stringToBinary = ahex
end function
%>
<html>
<head>
<title>Test</title>
</head>
<body>
<h1><%= result %></h1>
</body>
</html>
نصائح أخرى
أفترض أن لديك نطاق لتغيير DB ... أكثر تحديدا الإجراء المخزن؟
لماذا لا تقبل فقط التجزئة كسلسلة وإلقاءها على Varbinary داخل Broc؟
قراءة المزيد، لا توجد سلسلة مدمجة -> وظيفة Varbinary في SQL Server، ولكن هذه الوظيفة عرضت كحل سهل،
ربما لا علاقة لها بعض الشيء، لكنني أتساءل، إذا كنت تثبت التجزئة على العميل، كيف حالك بالضبط الحفاظ على الملح آمنا؟