2014-04-11 2 views
1

Мне нужно получить ключ из соленого пароля с использованием шифрования PBKDF2 в приложении C# & C++ Metro (WinRT). Что я должен использовать для вывода ключа с использованием PBKDF2 (например, вызов PKSC55PPKDF2_HMAC_SHA1 OpenSSL) на Metro? Есть ли версия OpenSSL, которая основывается на WinRT? (Я читал, что он только основывается на Windows для настольной платформы.) Или есть какое-то другое решение, которое я должен использовать?Использование шифрования PBKDF2 в приложении Metro (WinRT)

BTW Я мог бы назвать функцию либо с C#, либо с C++, так что все нормально. Любые советы будут высоко ценится!

EDIT: Я только что нашел функцию .NET с именем «Rfc2898DeriveBytes» - подробности here. Если я правильно прочитаю это, он будет делать то же самое, что и вызов PKSC_5BPDF2_HMAC_SHA1 OpenSSL - это правильно?

EDIT # 2: К сожалению, похоже, что я не могу использовать Rfc2898DeriveBytes ведь в моей ОС Windows 8.1 приложения Metro, потому что, несмотря на то, что Microsoft documentation for Rfc2898DeriveBytes говорит, что метод API не существует в «Windows.Security.Cryptography 'при создании приложения Windows 8.1. Есть ли что-нибудь еще, что я могу использовать?

+0

Да, это правильно, но, поскольку есть немного больше, я тоже написал ответ. –

ответ

3

После долгих копаний я наконец нашел this link. Вот что я сделал в своем приложении Metro:

private static bool GetPBKDFDerivedKey(string password, 
    byte[] salt,     // length = 32 bytes (256 bits) 
    out byte[] encryptionKeyOut) // length = 32 bytes (256 bits) 
{    
    IBuffer saltBuffer = CryptographicBuffer.CreateFromByteArray(salt); 
    KeyDerivationParameters kdfParameters = KeyDerivationParameters.BuildForPbkdf2(saltBuffer, 10000); // 10000 iterations 

    // Get a KDF provider for PBKDF2 and hash the source password to a Cryptographic Key using the SHA256 algorithm. 
    // The generated key for the SHA256 algorithm is 256 bits (32 bytes) in length. 
    KeyDerivationAlgorithmProvider kdf = KeyDerivationAlgorithmProvider.OpenAlgorithm(KeyDerivationAlgorithmNames.Pbkdf2Sha256); 
    IBuffer passwordBuffer = CryptographicBuffer.ConvertStringToBinary(password, BinaryStringEncoding.Utf8); 
    CryptographicKey passwordSourceKey = kdf.CreateKey(passwordBuffer); 

    // Generate key material from the source password, salt, and iteration count 
    const int keySize = 256/8; // 256 bits = 32 bytes 
    IBuffer key = CryptographicEngine.DeriveKeyMaterial(passwordSourceKey, kdfParameters, keySize); 

    // send the generated key back to the caller 
    CryptographicBuffer.CopyToByteArray(key, out encryptionKeyOut); 

    return true; // success 
} 
1

Вы можете использовать Rfc2898DeriveBytes как RFC actually defines PBKDF2. Обратите внимание, что вам необходимо убедиться, что вы используете одну и ту же кодировку символов, размер соли и количество раундов для совместимости. Обычно SHA1 используется как основная хеш-функция (что хорошо), но будьте осторожны, что PBKDF2 также может использовать другие хэш-функции. Rfc2898DeriveBytes использует SHA1 для функциональности HMAC.

Отметьте, что Rfc2898DeriveBytes использует UTF-8; это не документировано (даже после нескольких запросов) от Mickeysoft. Вместо этого вы можете использовать байтовые массивы, если не уверены в кодировке на обеих платформах. Особенно вам следует знать об этом, если вы разрешаете персонажам из диапазона ASCII в США.

+0

Спасибо за это, особенно информацию UTF-8! Я буду использовать [Rfc2898DeriveBytes] (http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx) в своем приложении. – dbeachy1

+0

Я попал в ловушку здесь - хотя в документации Microsoft для Rfc2898DeriveBytes говорится: «Платформы: Windows Phone 8.1, Windows Phone 8, Windows 8.1, ...», Visual Studio не работает во время компиляции с «Ошибка \t 1 Тип или пространство имен имя «Rfc2898DeriveBytes» не существует в пространстве имен «Windows.Security.Cryptography». Есть ли что-нибудь еще, что я могу использовать? – dbeachy1

+1

Я думаю, вы могли бы использовать исходный код Mono для того же класса, поскольку он, по-видимому, лицензирован MIT. Однако, возможно, вам придется внедрить другую реализацию HMAC. Там должен быть другой код, который также реализует его. Обратите внимание, что это не очень сложно реализовать, если у вас есть функции HMAC или даже SHA. –

Смежные вопросы