Bouncy Castle scrypt实施

时间:2014-03-06 14:06:09

标签: java bouncycastle scrypt

我目前正在使用 scrypt 实施密码哈希。我已经在GitHub上找到了一个很好的 scrypt 实现。令我惊讶的是,我还发现了scrypt implementation in the Bouncy Castle library。这个课没有记录,维基百科没有提到Bouncy Castle作为scrypt实现提供者,我找不到任何使用Bouncy Castles scrypt的人的代码示例,所以这看起来有些可疑。

另一方面,如果我不得不在GitHubs加密实施和Bouncy Castle之间做出选择,我更喜欢Bouncy Castle。

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


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

3 个答案:

答案 0 :(得分:3)

因此,人们不必去外部网站寻求答案:

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

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

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

答案 1 :(得分:1)

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

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

我无法真正说出你应该为costParam,blockSize或并行化使用什么值,文档并没有多说。在我们的研究中,我们每个人都使用了8个。

链接到他们的docus: 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

答案 2 :(得分:0)

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

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

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

BC JCE提供者未公开Scrypt-也许是因为JCE仅具有非常原始的PBE成本函数表达式(以交互计数的形式)。 Scrypt具有两个费用参数,因此不能轻易将其强制加入该API。

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