在Metro(WinRT)应用程序中使用PBKDF2加密
本文关键字:PBKDF2 加密 应用程序 Metro WinRT | 更新日期: 2023-09-27 17:57:55
我需要在C#&C++Metro(WinRT)应用程序。我应该使用什么来在Metro上使用PBKDF2(就像OpenSSL的PKCS5_PBKDF2_HMAC_SHA1调用一样)派生密钥?有没有基于WinRT构建的OpenSSL版本?(我读到它只在Windows桌面平台上构建。)或者我应该使用其他解决方案吗?
顺便说一句,我可以从C#或C++调用函数,所以两者都可以。任何建议都将不胜感激!
编辑:我刚刚发现了一个名为"Rfc2898DeriveBytes"的.NET函数——详细信息请参阅此处。如果我读对了,它将做与OpenSSL的PKCS5_PBKDF2_HMAC_SHA1调用相同的事情——这是正确的吗?
编辑#2:不幸的是,在我的Windows 8.1 Metro应用程序中,我似乎根本无法使用Rfc2898DeriveBytes,因为尽管Microsoft的Rfc2898deriveByte文档中有说明,但在构建Windows 8.1应用程序时,API方法不存在于"Windows.Security.Cryptography"命名空间中。还有什么我可以用的吗?
经过多次挖掘,我终于找到了这个链接。以下是我在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
}
您可以使用Rfc2898DeriveBytes
,因为RFC实际上定义了PBKDF2。请注意,您需要确保使用相同的字符编码、salt大小和轮次数才能兼容。通常,SHA1被用作底层哈希函数(这很好),但要注意PBKDF2也可能使用其他哈希函数。Rfc2898DeriveBytes
将SHA1用于HMAC功能。
请注意,Rfc2898DeriveBytes
使用UTF-8;Mickeysoft没有对此进行记录(即使在多次请求之后)。如果您不确定两个平台上的编码,可以使用字节数组。如果您允许美国ASCII范围之外的字符,您应该特别注意这一点。