سؤال

لديّ بضع قطع مختلفة من التعليمات البرمجية ولكن القصة القصيرة هي أنني أقوم بإدخال بعض كلمات المرور في قاعدة بيانات MySQL باستخدام SHA1 وأيضًا حساب تجزئة SHA1 في .NET وهي غير مطابقة. أعتقد أن هذه مشكلة في رمز الترميز الخاص بي في .NET.

رمز SQL:

INSERT INTO user_credentials (Password) VALUES (SHA1('password'));

تجزئة كلمة المرور إلى 5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8

رمز .NET:

public static string GetPasswordHash(string password)
{
    // problem here with encoding?
    byte[] byteArray = Encoding.ASCII.GetBytes(password);

    SHA1 sha = new SHA1CryptoServiceProvider();
    byte[] hashedPasswordBytes = sha.ComputeHash(byteArray);

    return Encoding.ASCII.GetString(hashedPasswordBytes);
}

تجديدات كلمة المرور لـ [؟ A ؟؟؟؟؟؟؟ ٪ L؟ 3 ~ ؟؟؟

شكرا على اي مساعدة!

هل كانت مفيدة؟

المحلول

في مثال MySQL ، تقوم بترميز إلى السداسي عشري String ، في مثال .NET ، تقوم بترميز في ASCII. الترميزات ليست هي نفسها.

إذا قمت بتحويل إلى سداسي عشري في إصدار .NET ، تحصل على النتيجة الصحيحة:

string hex = BitConverter.ToString(hashedPasswordBytes);

نتيجة:

5B-AA-61-E4-C9-B9-3F-3F-06-82-25-0B-6C-F8-33-1B-7E-E6-8F-D8

نصائح أخرى

تحتاج إلى وضع [?a??????%l?3~??? في عرافة التمثيل. ربما يكون ما تطبعه في شكل ثنائي (وبالتالي المضاعفات ? chars).

حاول القيام بذلك:

string hexstring = BitConverter.ToString(hashedPasswordBytes);

وانظر إذا hexstring و MySQL Hash Match.

سوف يمنحك ما يلي مطابقة دقيقة لما ينتجه MySQL:

 BitConverter.ToString(SHA1CryptoServiceProvider.Create().ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(Password))).Replace("-", "").ToLower();

يجب أن تكون تجزئة SHA1 متساوية ، لكن التمثيل ليس كذلك. يخرج MySQL سلسلة سداسية ، لذلك ستحتاج إلى فعل الشيء نفسه في .NET:

return String.Join(String.Empty, hashedPasswordBytes.Select(b => b.ToString("x2")))

كيف يتم ترميز جدول/قاعدة بيانات MySQL؟ حاول إعداد كلاهما على UTF-8 (وبالتالي باستخدام inchoding.utf8.getBytes)

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