我的任务是编写一种新的方法来计算密码哈希值,以取代我们认为还不够安全的旧方法。不久前,我读了《安全驱动.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);
}
}
}
您有正确的想法/方法-这是一个更好的实现:
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);
}
您所要求pbkdf2
的字节数不应超过基础PRF的字节长度(在您的情况下为SHA512,它将产生64个字节)。
您可以保留hkdf
上下文,null
因为似乎不需要它。
对于其他人可能想知道上面代码使用的库-Inferno crypto。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句