在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(WinRT)应用程序中使用PBKDF2加密

经过多次挖掘,我终于找到了这个链接。以下是我在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范围之外的字符,您应该特别注意这一点。