التعامل مع تجزئته كلمات السر المخزنة كما varbinary في SQL Server و ASP الكلاسيكية

StackOverflow https://stackoverflow.com/questions/775702

سؤال

كل شيء ،

آسف مقدما - أنا مبتدئ في معظم المواضيع أدناه (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، ولكن هذه الوظيفة عرضت كحل سهل،

ربما لا علاقة لها بعض الشيء، لكنني أتساءل، إذا كنت تثبت التجزئة على العميل، كيف حالك بالضبط الحفاظ على الملح آمنا؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top