我目前正在使用 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
答案 0 :(得分:3)
因此,人们不必去外部网站寻求答案:
像这样导入SCrypt:
import org.bouncycastle.crypto.generators.SCrypt;
像这样使用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公开。