12

我目前正在使用scrypt实现密码散列。我已经在 GitHub 上找到了一个不错的scrypt实现。令我惊讶的是,我还在Bouncy Castle 库中发现了一个scrypt实现。该课程没有记录,维基百科没有提到 Bouncy Castle 作为 scrypt 实现提供者,而且我很难找到任何使用 Bouncy Castles scrypt 的人的代码示例,所以这对我来说有点可疑。

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

那么Bouncy Castles scrypt是“真实的东西”吗?我可以在 JCA 提供程序 API 上使用 Bouncy Castles scrypt 吗(或者我是否需要像这里一样直接调用它:AES-256 encryption workflow in scala with bouncy castle: salt and IV usage and transfer/storage)?


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

4

3 回答 3

5

这样人们就不必去外部网站寻找答案:

  1. 确保充气城堡罐在您的构建路径上
  2. 像这样导入 SCrypt:

    import org.bouncycastle.crypto.generators.SCrypt;
    
  3. 像这样使用 SCrypt:

    byte[] sCryptHash = SCrypt.generate(plaintext.getBytes(), salt.getBytes(), cpuDifficultyFactor, memoryDifficultyFactor, parallelismDifficultyFactor, outputLength);
    
于 2017-02-02T00:56:25.543 回答
2

您可以使用SCrypt该类及其静态方法generate,如下所示:

SCrypt.generate(passwordBytes, salt, costParam, blockSize, parallelization, passwordLength);

我真的不能说你应该为 costParam、blockSize 或并行化使用什么值,文档并没有说太多。在我们的研究中,我们对每一个都使用了 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

于 2017-07-16T14:54:21.890 回答
0

我可以从 bouncycastle.org 邮箱获得的最佳答案:

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

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

Scrypt 没有被 BC JCE 提供者公开——也许我会说因为 JCE 只有非常原始的 PBE 成本函数表达式(以交互计数的形式)。Scrypt 有两个成本参数,因此不能轻易将其强制到该 API 中。

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

于 2020-06-17T08:28:12.503 回答