2016-07-22 144 views
4

我的任务是编写一种计算密码哈希的新方法,以取代我们感觉不够安全的旧方法。很久以前,我读了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); 
     } 
    } 
} 

回答

4

你有正确的思路/办法 - 这里是一个稍微好一点的实现:

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的字节长度多字节(你的情况,产生64字节的SHA512)。

您可以将hkdf上下文作为null,因为您似乎并不需要它。

对于其他谁可能想知道上面的代码使用什么库 - Inferno crypto