【发布时间】:2011-07-11 20:17:49
【问题描述】:
好的。所以我几天来一直在谷歌搜索,试图找到这个问题的答案。我正在尝试像 keytool 一样对公钥/私钥对的私钥进行密码保护。这需要在 keytool 不可用的环境中使用,另外,我想了解 keytool 是如何做到的。有谁知道如何在 Java 中做到这一点?
【问题讨论】:
标签: java encryption key
好的。所以我几天来一直在谷歌搜索,试图找到这个问题的答案。我正在尝试像 keytool 一样对公钥/私钥对的私钥进行密码保护。这需要在 keytool 不可用的环境中使用,另外,我想了解 keytool 是如何做到的。有谁知道如何在 Java 中做到这一点?
【问题讨论】:
标签: java encryption key
使用password based encryption - 最好用于此目的。
Keytool 本身并没有实现它。它在密钥库中实现。在java.security.KeyStoreSpi#engineSetKeyEntry 和java.security.KeyStoreSpi#engineGetKey 方法中更准确。
密钥库类型 JKS 在sun.security.provider.JavaKeyStore 中实现。密码保护在sun.security.provider.KeyProtector 中实现。 JKS 以PKCS#8 格式存储密钥,但使用自己的算法(OID 1.3.6.1.4.1.42.2.17.1.1)和 SHA1。它是一种 PBE。看看example of open JKS implementation。
正如汤姆在下面(在他的评论中)建议的那样,您可以查看 sun.security.tools.KeyTool 类。
【讨论】:
由于您需要反转存储的密码,因此通常会应用特定于应用程序的编码。
例如在 WebSphere 中,它是一个异或哈希和 base64 编码。
它们通常有一些类似存储文件或一些配置文件来存储编码密码。 (不是我不用加密这个词)
这意味着密码不能轻易被某人无意中看到。但是,知道编码算法的人可以轻松对其进行解码,因此需要将存储文件或配置文件保存在安全位置。
【讨论】:
最佳选择:使用带盐的 AES 加密。在密码学方面,使用经过良好测试的技术而不是自己动手通常是一个好主意。这是另一个帖子,它的答案应该可以回答你所有的问题:Java 256-bit AES Password-Based Encryption
【讨论】: