加密种子的最佳方法是什么?

时间:2019-03-23 02:44:46

标签: java security encryption

几个小时以来,我一直在努力解决一个简单的问题。我正在开发需要种子短语才能运行的桌面应用程序(钱包)。 自然地,种子需要使用密码进行加密并存储到配置文件中。我发现Jasypt使我能够轻松地加密String,但是显然Jaspyt的PBEStringencryptor应该不安全/不建议使用。由于只有一个密码,因此加盐不会有任何意义(会吗?)。 我在stackoverflock上发现了许多其他方法,但我一直在说专家们出现并声称方法x是多么不安全。

总结一下我的问题:由于我只处理一个种子短语,使用Jasypt的Stringencryptor是否足够?还是应该使用其他方法?

3 个答案:

答案 0 :(得分:2)

您一直在寻找安全解决方案的原因可能是没有安全解决方案通常可以正常使用。

让我重申一下我认为您正在尝试解决的问题:

  1. 您的应用程序需要一个“秘密”才能运行。
  2. 您无法信任用户。 (如果可以的话,从理论上讲,您可以使用户每次使用系统时都提供秘密。)
  3. 由于以下一个或多个原因,您不能依靠操作系统访问控制来确保“秘密”的安全:

    • 操作系统不足或错误
    • 您不信任操作员/管理员
    • 您不能确定系统未被黑客入侵,或者
    • 该系统不是物理上受保护的。 (如果某人可以在足够长的时间内无法检测到对硬件的物理访问,他们就可以规避操作系统的安全性。)

基于上述假设,没有安全的解决方案。无论您的应用程序代码做什么,拥有足够的OS级特权(正确分配或恶意获得)的人都有可能观看您的代码在做什么并拦截秘密。

那该怎么办?

  • 如果您可以假定该平台是安全的,并且运营商是受信任的,则可以使用技术方法来保护机密的安全……防止非特权用户进入。

  • 某些类型的安全攻击已得到缓解。例如,您可以使用Hardware Security Module来保存机密,这样就不必将其存储在文件系统中。

  • 否则,...在您的(安全)基础结构上运行软件,而不是在用户的PC或客户的服务器上运行。

答案 1 :(得分:1)

  

种子需要用密码加密并存储到配置文件中。

看来您是正确的,对种子进行加密的最合理方法是使用某种基于密码的加密(PBE ..)。

  

由于只有一个密码,所以给它加盐是没有任何意义的(会吗?)。

您正在存储加密的种子值本身,因此在这种情况下,您可以使用一些应用程序范围的静态盐

  

PBEStringencryptor应该不安全/不建议使用。   使用Jasypt的Stringencryptor就足够了

我不知道Jasyp是不安全的,它更多地取决于使用的参数(是否有引用?)。我通常将纯Java与标准PBKDF2 a few examples一起使用。但是,Jasyp无需更深入的知识即可正确完成加密。密码学的问题在于,仅使用错误的参数集或使用错误的方式就很容易完全破坏安全性。如果您只是开始,那么使用PBEStringencryptor可能是更安全的选择。

有人提到使用硬件模块(例如智能卡,TPM等)可能会更安全,但便携性较差

答案 2 :(得分:0)

我不是Java开发人员,但按照说明,在您的情况下,我要做的就是在将种子存储到配置文件中之前,使用所需密码对种子进行非对称加密。

您可以使用Rivest Shamir Adleman(RSA),椭圆曲线密码术(ECC)列出一些算法。

欢呼