Java密码加密


问题内容

我正在尝试学习如何使用Java进行基于密码的加密。我在网上找到了几个示例,但在Stack
Overflow上还没有(到目前为止)。这些示例对我的解释不大,尤其是在算法选择方面。似乎有很多传递字符串来说明要使用什么算法,但是很少有关于字符串来自何处以及含义的文档。而且似乎不同的算法可能需要KeySpec类的不同实现,所以我不确定哪种算法可以使用我正在查看的PBEKeySpec类。此外,所有示例似乎都有些过时,许多示例要求您获得以前不属于JDK甚至第三方实现的旧加密程序包。

有人可以简单介绍一下我实现加密(字符串数据,字符串密码)和解密(字节[]数据,字符串密码)需要做什么吗?


问题答案:

我会在论坛上提供或接受与安全相关的建议时会保持谨慎态度……具体细节非常复杂,而且通常很快就会过时。

话虽如此,我认为Sun的Java密码体系结构(JCA)参考指南是一个很好的起点。查看随附的代码示例,该示例说明基于密码的加密(PBE)。

顺便说一句,标准JRE仅提供了一些开箱即用的PBE选项(“
PBEWithMD5AndDES”就是其中之一)。要获得更多选择,您将需要“强大的加密包”或某些第三方提供商,例如Bouncy
Castle
。另一种选择是使用JRE中提供的哈希和密码算法来实现自己的PBE。您可以通过SHA-256和AES-128来实现PBE(示例加密/解密方法)。

简而言之,PBE的加密方法可能涉及以下步骤:

  1. 从用户那里获取密码和明文,然后将它们转换为字节数组。
  2. 产生安全的随机
  3. 将盐添加到密码并计算其加密哈希。重复多次。
  4. 使用所得的哈希值作为初始化向量和/或密钥对明文进行加密。
  5. 保存盐和所得密文。