当您使用 Java Keytool 实用程序构建密钥存储时,如何保护密钥?我通读了文档,我意识到每个私钥都有一个密钥密码,然后商店有一个商店密码。
但是使用什么机制来保护数据呢?它是加密密码吗?如果是的话,算法是什么?我特别关注 keytool 在构建 JKS 文件时如何进行保护。
Note从 Java 9 开始的 Java 版本默认使用 PKCS#12 密钥存储类型,而不是 JKS。
Sun 的默认 JKS 密钥库使用专有算法,主要是为了绕过标准算法的导出限制。该算法在此类中实现,
sun.security.provider.KeyProtector
这是算法的描述,
这是 Sun 专有的可导出算法的实现,旨在在保护(或恢复其明文版本)敏感密钥时使用。该算法并非旨在作为通用密码。这就是密钥保护算法的工作原理: p - 用户密码 s - 随机盐 X - 异或密钥 P - 待保护的密钥 Y - 受保护的密钥 R - 密钥库中存储的内容 步骤 1:获取用户的密码,向其附加一个随机盐(固定大小),并对其进行哈希处理: d1 = 摘要(p, s) 将 d1 存储在 X 中。 步骤 2:获取用户的密码,附加上一步的摘要结果,并对其进行哈希处理: dn = 摘要(p, dn-1)。将 dn 存储在 X 中(将其附加到之前存储的摘要中)。重复此步骤,直到 X 的长度与私钥 P 的长度匹配。 步骤 3: X 和 P 进行异或,并将结果存储在 Y 中: Y = X XOR P。 步骤 4: 存储 s、Y 和摘要(p , P) 在结果缓冲区 R 中:R = s + Y + 摘要(p, P),其中“+”表示串联。 (注意:digest(p, P) 存储在结果缓冲区中,以便在恢复密钥时,我们可以检查恢复的密钥是否确实与原始密钥匹配。) R 存储在密钥库中。受保护的密钥恢复如下: 步骤1和步骤2与上面相同,只是salt不是随机生成的,而是取自步骤4的结果R(第一个长度字节)。步骤 3(XOR 运算)产生明文密钥。然后将密码与恢复的密钥连接起来,并与 R 的最后一个 length(digest(p, P)) 字节进行比较。如果匹配,则恢复的密钥确实与原始密钥相同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)