我在Google上搜索过,但是找不到使用Cryptsharp库的Scrypt用法代码示例(用于哈希密码)。
您能否提供散列密码的示例?
答案 0 :(得分:15)
它只是a single call所以我将引导您完成参数:
key
:这是您的密码,使用UTF-8编码(没有字节顺序标记)将您的密码编码为字节数组; salt
:存储有scrypt函数结果的一串安全随机字节,16个字节应该足够; cost
:给定的建议是262144,但如果您的服务器可以处理额外的负载,您可能希望增加该值; blockSize
:看到费用,给定的建议是8; parallel
:除非您想尝试使用多线程,否则我会将其保持为1; maxThreads
:一般来说null
会做得很好; derivedKeyLength
:嗯,这取决于,虽然密码128应该足够,但是你的密码不太可能超过128位的安全性。你应该至少储存盐和结果。如果要将它们存储为字符串,则可能需要使用base 64编码。
我建议您存储一个额外的数据:基于密码的密钥派生方案(PBKDF)的版本。比如说,使用scrypt将其设置为1
,使用给定的密钥编码,salt size,cost,blocksize等。在这种情况下,您可以稍后升级您的方案(您需要用户提供他/她的密码到这样做,所以你必须在线完成这项工作,这样你最终可以同时运行多个方案。)
请注意,您可以链接PBKDF函数调用,因此您可以使用原始PBKDF输出并将其用作下一个PBKDF的输入。在这种情况下,用户不必提供密码(此提示是在另一个问题上从CodesInChaos获取的)。
答案 1 :(得分:1)
@MaartebBodewes提供了一个很好的答案,非常明智的附加提示。这是一个代码示例及其建议。我还建议您阅读' Your password is too damn short'这表明使用现代密码学的重要性(在撰写本文时)BCrypt或Scrypt。
public string Hash(string secret, string salt)
{
var keyBytes = Encoding.UTF8.GetBytes(secret);
var saltBytes = Encoding.UTF8.GetBytes(salt);
var cost = 262144;
var blockSize = 8;
var parallel = 1;
var maxThreads = (int?)null;
var derivedKeyLength = 128;
var bytes = SCrypt.ComputeDerivedKey(keyBytes, saltBytes, cost, blockSize, parallel, maxThreads, derivedKeyLength);
return Convert.ToBase64String(bytes);
}