Alx*_*ndr 4 .net password-hash pbkdf2
我的任务是编写一种计算密码哈希的新方法,以取代我们认为还不够安全的旧方法。不久前,我读了《Security Driven .NET》一书,其中我了解到重要的部分是使用具有可配置转数(而不是简单的散列)的算法,而在 .NET 中推荐的算法是叫PBKDF2用于密码处理。我还读到,作为对 ASP.NET 处理密码方式的改进,如果存储在数据库中的结果哈希通过使用 PBKDF2 创建主节点以加密方式绑定到用户(名称或 ID),那就太好了密钥,然后使用用户名(或 ID)使用 HKDF 创建派生密钥。但同样,这是我从一本我目前无法访问的书中读到的肤浅知识,所以我无法重新检查我的记忆是否正确。
另外,我之前没有使用过 .NET DerivedBytes API,所以我可能做错了。所以我的问题是:我在下面的代码中做对了吗?我是否正确使用了 API?这个实现是否“足够安全”?或者我做错了什么,完全消除了所有的安全性?
protected override byte[] ComputeHash(string user, string salt, string password)
{
var userBytes = user.ToBytes();
?
using (var pbkdf2 = new PBKDF2(MacFactories.HMACSHA512, password.ToBytes(), salt.ToBytes()))
{
var masterKey = pbkdf2.GetBytes(128);
using (var hkdf = new HKDF(MacFactories.HMACSHA512, masterKey, userBytes, userBytes))
{
return hkdf.GetBytes(64);
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
您有正确的想法/方法 - 这是一个稍微好一点的实现:
byte[] ComputeHash(string user, string salt, string password)
{
using (var pbkdf2 = new PBKDF2(HMACFactories.HMACSHA512, password, salt.ToBytes()))
using (var hkdf = new HKDF(HMACFactories.HMACSHA512, pbkdf2.GetBytes(64), user.ToBytes()))
return hkdf.GetBytes(64);
}
Run Code Online (Sandbox Code Playgroud)
您不应该要求pbkdf2比基础 PRF 的字节长度更多的字节(在您的情况下,SHA512 产生 64 个字节)。
您可以离开hkdf上下文,null因为您似乎不需要它。
对于可能想知道上述代码使用什么库的其他人 - Inferno crypto。
| 归档时间: |
|
| 查看次数: |
699 次 |
| 最近记录: |