C#PasswordDeriveBytes混淆
我在C#中有以下代码
PasswordDeriveBytes DerivedPassword = new PasswordDeriveBytes(Password, SaltValueBytes, HashAlgorithm, PasswordIterations); byte[] KeyBytes = DerivedPassword.GetBytes(32);
我正在使用“SHA1”哈希算法。
根据SHA1定义,它生成160位(20字节)密钥。 我的问题是GetBytes方法如何从DerivedPassword中获取32个字节,GetBytes方法后面使用了什么算法?
微软对原始PKCS#5(又名PBKDF1)的实现包括不安全的扩展,以提供比散列函数所能提供的更多字节(参见此处和此处的错误报告)。
即使它没有错误,你应该避免未经证实的专有标准扩展(或者你将来可能永远无法解密你的数据 – 至少不在Windows之外。)
我强烈建议您使用较新的Rfc2898DeriveBytes
,它实现了自.NET 2.0以来可用的PBKDF2(PKCS#5 v2)。
GetBytes方法背后使用什么算法?
它使用算法PBKDF1,稍作修改以允许任意密钥长度。 替换类, Rfc2898DeriveBytes
使用PBKDF2。
您可以阅读有关PBKDF2的维基百科文章,以了解基础概念使其发挥作用的一般概念。
密钥派生函数使用称为密钥拉伸的function。 (不要在维基百科上查找它,因为当前的文章将这个概念与Key Enhance混淆,后者完全不同。)
键拉伸通常通过在CTR模式下应用PRF(例如散列函数或密码),或通过迭代它并连接中间输出来完成。
例如,如果使用CTR过程,SHA-1作为PRF,并且需要32字节的伪随机输出,则将SHA1(keymaterial,0)与SHA1的前12个字节(keymaterial,1)连接起来。
- 在FormFlows – Bot Framework中为Quit添加另一个关键字
- 在C#中使用带有generics的访问者模式
- 使用C#.NET执行外部EXE
- c#Directory.GetDirectories不包括文件夹
- 将匿名类型的List 转换为Dictionary <string,SortedList >
- C#中的Pop3到SMTP消息自定义转发器
- 创建没有名称空间声明的XML元素
- WebRequest:如何使用针对此ContentType的WebRequest查找邮政编码=“application / xhtml + xml,text / xml,text / html; 字符集= UTF-8” ?
- 高效的笛卡尔积算法