Scrypt和Cryptsharp的示例代码

时间:2013-11-18 08:15:37

标签: c# encryption cryptography scrypt

我在Google上搜索过,但是找不到使用Cryptsharp库的Scrypt用法代码示例(用于哈希密码)。

您能否提供散列密码的示例?

2 个答案:

答案 0 :(得分:15)

它只是a single call所以我将引导您完成参数:

  1. key:这是您的密码,使用UTF-8编码(没有字节顺序标记)将您的密码编码为字节数组;
  2. salt:存储有scrypt函数结果的一串安全随机字节,16个字节应该足够;
  3. cost:给定的建议是262144,但如果您的服务器可以处理额外的负载,您可能希望增加该值;
  4. blockSize:看到费用,给定的建议是8;
  5. parallel:除非您想尝试使用多线程,否则我会将其保持为1;
  6. maxThreads:一般来说null会做得很好;
  7. derivedKeyLength:嗯,这取决于,虽然密码128应该足够,但是你的密码不太可能超过128位的安全性。
  8. 你应该至少储存盐和结果。如果要将它们存储为字符串,则可能需要使用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);
}