классический asp использует capicom для хеширования md5 - результат отличается от .net System.Security.Cryptography - PullRequest
4 голосов
/ 24 октября 2011

При использовании CAPICOM в Classic ASP (VBScript) для выполнения хэширования MD5, например, так:

With server.CreateObject("CAPICOM.HashedData")
    .Algorithm = 3                  ' CAPICOM_HASH_ALGORITHM_MD5
    .Hash "password"

    md5Pwd = .Value
End With

Я получаю такой результат: B081DBE85E1EC3FFC3D4E7D0227400CD

Когда я использую .NET, я получаюэтот результат: 5f4dcc3b5aa765d61d8327deb882cf99

Почему строки MD5 отличаются?Что я делаю не так?

Вот моя функция C #:

MD5 md5Hasher = MD5.Create();
byte[] data = md5Hasher.ComputeHash( Encoding.Default.GetBytes( val ) );

StringBuilder sBuilder = new StringBuilder();

// Loop through each byte of the hashed data 
// and format each one as a hexadecimal string.
for( int i = 0; i < data.Length; i++ ) {
    sBuilder.Append( data[i].ToString( "x2" ) );
}

// Return the hexadecimal string.
return sBuilder.ToString();

1 Ответ

5 голосов
/ 25 октября 2011

Проблема в том, что вы используете кодировку Encoding.Default, которая представляет 7-битные символы ASCII .В то же время « CAPICOM манипулирует только строками Unicode при проверке и генерации цифровых подписей ».

Таким образом, Encoding.Default.GetBytes имеет дело с однобайтовыми символами (потеря любых данных не-ASCIIпуть), в то время как CAPICOM.HashedData обрабатывает их как 2-байтовые символы Unicode.

Замените Encoding.Default на Encoding.Unicode, чтобы сделать вашу реализацию .NET совместимой с CAPICOM.

OneОбратите внимание: используйте data[i].ToString("X2"), чтобы получить результат в верхнем регистре, как в реализации CAPICOM.

...