弹性城堡 scrypt 实现

12

我正在使用scrypt实现密码哈希。我已经在GitHub上找到了一个不错的scrypt实现。令我惊讶的是,我还发现了Bouncy Castle库中的scrypt实现。这个类没有文档,维基百科也没有提到Bouncy Castle作为scrypt实现提供商,我很难找到任何使用Bouncy Castle scrypt的代码示例,所以这看起来有点可疑。

另一方面,如果我必须在GitHub的加密实现和Bouncy Castle之间选择,我会选择Bouncy Castle。

那么,Bouncy Castle的scrypt是“真正的东西”吗?我可以在JCA提供程序API上使用Bouncy Castle的scrypt吗(或者我需要像这里一样直接调用它:在scala中使用Bouncy Castle进行AES-256加密工作流程:盐和IV的使用和传输/存储)?


编辑:目前我能得到的最佳答案是:https://www.bouncycastle.org/devmailarchive/msg13653.html

3个回答

5

为了让人们不必去外部网站寻找答案:

  1. Make sure bouncy castle jars are on your build path
  2. Import SCrypt like so:

    import org.bouncycastle.crypto.generators.SCrypt;
    
  3. Use SCrypt like so:

    byte[] sCryptHash = SCrypt.generate(plaintext.getBytes(), salt.getBytes(), cpuDifficultyFactor, memoryDifficultyFactor, parallelismDifficultyFactor, outputLength);
    

1
generate方法是静态的,您不能通过实例化Scrypt对象来使用它。 - Chamila Wijayarathna

2
您可以使用SCrypt类及其静态方法generate,像这样:
SCrypt.generate(passwordBytes, salt, costParam, blockSize, parallelization, passwordLength);

我无法确定costParam、blockSize或parallelization应该使用哪些值,因为文档中没有提供太多信息。在我们的研究中,我们对每个参数都使用了8。

链接到它们的文档: BCrypt - https://www.bouncycastle.org/docs/docs1.5on/org/bouncycastle/crypto/generators/BCrypt.html SCrypt - https://www.bouncycastle.org/docs/docs1.5on/org/bouncycastle/crypto/generators/SCrypt.html


有一些好的信息在 https://dev59.com/5mgu5IYBdhLWcg3wt5Pt,但不确定它是否适用于当前的硬件,因为这些答案有点旧了。 - Chamila Wijayarathna
1
由于BC实现使用Java,它与本地代码(C ++)实现(请参见https://github.com/wg/scrypt及其分支)相比如何?请注意,为了使Scrypt(或任何密钥拉伸)对抗攻击者有效,它需要尽可能快地运行。 - Andreas

0

我从bouncycastle.org的邮箱中得到的最佳答案:

是的,scrypt实现是真实存在的——也就是说,代码确实存在,并且它通过了官方测试向量。

有几个注意点:该实现没有利用密码破解器将使用的所有并行性/优化,因此存在一些防御者/攻击者的不对称性。 Scrypt还基于Salsa20代码函数,而Salsa20在Java中表现相对较差(与AES持平),而在具有SIMD功能的平台上表现出色(可能快4-5倍)。

BC JCE提供程序未公开Scrypt——也许我会说,因为JCE只具有PBE成本函数的非常原始的表示形式(以迭代计数的形式)。 Scrypt具有两个成本参数,因此不能轻松地强制其进入该API。

如果有足够的需求,我想可以通过JCE以硬编码的并行化参数或BC特定的参数规范来公开它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接