【问题标题】:Example code for Scrypt and CryptsharpScrypt 和 Cryptsharp 的示例代码
【发布时间】:2013-12-01 07:39:51
【问题描述】:

我在 Google 上进行了搜索,但找不到使用 Cryptsharp 库的 Scrypt 用法(用于散列密码)的代码示例。

您能否提供一个对密码进行哈希处理的示例?

【问题讨论】:

  • 威廉,有很多问题你还没有接受答案。请你检查一下,看看哪些可以接受?如果答案不完整,请告诉我们!
  • 只是需要一些时间来确认它是否有效,现在它已被标记为答案。

标签: c# encryption cryptography scrypt


【解决方案1】:

这只是a single call,所以我将引导您了解参数:

  1. key:这是你的密码,使用UTF-8编码(不带字节序标记)将你的密码编码成字节数组;
  2. salt:用scrypt函数的结果存储的一串安全随机字节,16字节应该足够了;
  3. cost:给定的建议是 262144,但如果您的服务器可以处理额外的负载,您可能希望增加该值;
  4. blockSize:看cost,给出的建议是8;
  5. parallel:除非您想尝试多线程,否则我会将其保持为 1;
  6. maxThreads:一般null 会做得很好;
  7. derivedKeyLength:嗯,这取决于,因为密码 128 应该足够了,但您的密码不太可能有超过 128 位的安全性。

您应该至少存储盐和结果。如果要将它们存储为字符串,则可能需要使用 base 64 编码。

我建议您存储一条额外的数据:基于密码的密钥派生方案 (PBKDF) 的一个版本。比如说,将其设置为 1 以使用 scrypt,使用给定的密钥编码、盐大小、成本、块大小等。在这种情况下,您可以稍后升级您的方案(您需要用户提供他/她的密码来执行此操作,因此您必须在线执行此操作,因此您最终将有多个方案同时运行)。

请注意,您可以链接 PBKDF 函数调用,因此您可以使用原始 PBKDF 输出并将其用作下一个 PBKDF 的输入。在这种情况下,用户不必提供密码(此提示来自 CodesInChaos 的另一个问题)。

【讨论】:

  • 一般来说,如果您有多个用户,您只需要多线程的性能优势。但是,如果您有多个用户,他们可能会为您执行多线程。因此,从这个意义上说,只有当您希望为使用高 costblockSize 的用户提供更短的延迟时,它才有用。
  • 它似乎工作得很好,但我不能使用 Crypter.CheckPassword() 命令。是否可以将提供的密码与存储在用户记录中的盐进行哈希处理并将其与保存的密码进行比较?
  • 成本如何影响生成哈希所需的时间?即,如果我将 262144 的成本减半,它会花费一半的时间还是比那更线性?
  • 是的,比较应该可以正常工作。最好使用在恒定时间内返回的比较(攻击者应该不可能看到哪个字节失败,即使密码之前已经过哈希处理)。成本是一个简单的 for/next 的输入,所以是的,这应该是一个线性值(注意它应该是 2 的幂)。查看相对较小的scrypt draft 了解更多信息,它应该很容易阅读。
  • @MaartenBodewes “一组随机的安全随机字节”是什么意思? “与结果一起存储”意味着:将此方法的结果以及您作为参数传递给它的盐值一起存储在该用户的数据库行中的“键”和“盐”列中?跨度>
【解决方案2】:

@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);
}

【讨论】:

  • 你在这里使用哪个库?我没有看到任何用于 Scrypt 的 Scrypt.ComputeDerivedKey()
猜你喜欢
  • 2017-03-31
  • 2015-05-09
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多