Java Bouncy Castle scrypt实现

Java Bouncy Castle scrypt实现,java,bouncycastle,scrypt,Java,Bouncycastle,Scrypt,我目前正在使用scrypt实现密码哈希。我已经在GitHub上找到了一个很好的scrypt实现。令我惊讶的是,我还发现了一个。这个类没有文档记录,Wikipedia没有提到Bouncy Castles是scrypt实现提供者,我很难找到任何使用Bouncy Castles scrypt的人的代码示例,所以我觉得这有点可疑 另一方面,如果我必须在GitHubs加密实现和Bouncy Castle之间进行选择,我会选择Bouncy Castle 那么,有弹性的城堡是真的吗?我可以在JCA提供程序AP

我目前正在使用scrypt实现密码哈希。我已经在GitHub上找到了一个很好的scrypt实现。令我惊讶的是,我还发现了一个。这个类没有文档记录,Wikipedia没有提到Bouncy Castles是scrypt实现提供者,我很难找到任何使用Bouncy Castles scrypt的人的代码示例,所以我觉得这有点可疑

另一方面,如果我必须在GitHubs加密实现和Bouncy Castle之间进行选择,我会选择Bouncy Castle

那么,有弹性的城堡是真的吗?我可以在JCA提供程序API上使用Bouncy Castles scrypt吗(或者我需要像这里这样直接调用它:)



编辑:我现在能得到的最佳答案是:

,这样人们就不必到外部网站寻求答案:

  • 确保有弹性的城堡罐子在你的建造路径上
  • 像这样导入SCrypt:

    import org.bouncycastle.crypto.generators.SCrypt;
    
    byte[] sCryptHash = SCrypt.generate(plaintext.getBytes(), salt.getBytes(), cpuDifficultyFactor, memoryDifficultyFactor, parallelismDifficultyFactor, outputLength);
    
  • 像这样使用SCrypt:

    import org.bouncycastle.crypto.generators.SCrypt;
    
    byte[] sCryptHash = SCrypt.generate(plaintext.getBytes(), salt.getBytes(), cpuDifficultyFactor, memoryDifficultyFactor, parallelismDifficultyFactor, outputLength);
    

  • 您可以将
    SCrypt
    类与其静态方法
    generate
    一起使用,如下所示:

    SCrypt.generate(passwordBytes, salt, costParam, blockSize, parallelization, passwordLength);
    
    我真的不能说应该使用什么值来实现costParam、blockSize或并行化,文档对此没有太多说明。在我们的研究中,我们使用了8个

    链接到他们的文档: BCrypt-
    SCrypt-

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

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

    需要注意的是:该实现并没有利用密码破解者将利用的所有并行性/优化,因此存在一点防御者/攻击者的不对称性。 ScRyPt也是基于SalSA20代码功能,SalSA20在java中执行相对较差(与AES相当),同时在SIMD能力平台上执行(可能4-5倍更快)。 Scrypt没有被BC-JCE提供者公开——也许我会说,因为JCE只有非常原始的PBE代价函数表达式(以交互计数的形式)。 Scrypt有两个成本参数,因此不能简单地将其强制到该API中

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


    generate方法是静态的,你不能通过实例化一个Scrypt对象来使用它,这里有一些很好的信息,不确定它如何适应当前的硬件,因为答案有点陈旧。由于BC实现使用Java,它与本机代码(C++)实现(请参阅及其分支)相比如何?请注意,为了使Scrypt(或任何键拉伸)能够有效抵御攻击者,它需要尽可能快地运行。