我的任务是编写一种计算密码哈希的新方法,以取代我们感觉不够安全的旧方法。很久以前,我读了Security Driven .NET这本书,其中我了解到重要的部分是使用具有可配置的转数(而不是简单的哈希)的算法,并且在.NET中推荐的算法是称为PBKDF2
用于密码处理。我还认为,作为对ASP.NET如何处理密码的一种改进,如果通过使用PBKDF2创建主数据库的方式将存储在数据库中的结果哈希与用户(名称或ID)加密绑定在一起键,然后使用用户名(或ID)使用HKDF创建派生密钥。但是,再次,这是我从一本我目前无法访问的书中读到的表面知识,所以如果我的记忆是正确的,我不能重新检查。在.NET中使用PBKDF2和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);
}
}
}