Java 密钥库密码毫无意义?

2022-09-02 13:46:43

密钥库密码背后的含义究竟是什么,例如在 JKS/BKS 密钥库上?

这显然不是为了安全,因为我可以使用编辑器打开文件并将所有条目复制到新文件中而无需密码检查。受密码保护的密钥库内的数据未加密!

此密码保护什么?这似乎只是为了讨厌开发人员oO...


答案 1

假设您在密钥库中保存了一个名为“这是我的句子”的字符串,当您通过记事本打开它时,您看到密文“blabla”,并将“blabla”复制到另一个文件并声称您找到了纯文本,它是“blabla”,这显然是不正确的,您仍然不知道原始的pliant-ext,直到通过密码恢复它。

==编辑==

对于 JKS 密钥库,密钥库密码用于验证完整性,src

636   if (password != null) {
637       md = getPreKeyedHash(password);
638       dis = new DataInputStream(new DigestInputStream(stream, md));
639   }

DigestInputStream生成一个签名,并将其与acutal签名进行比较,以查看是否被修改。

BouncyCastle密钥库UBER更安全,整个密钥库使用基于SHA1和Twofish(PBEWithSHAAndTwofish-CBC)的PBE加密

        Cipher cipher = this.makePBECipher(cipherAlg, Cipher.DECRYPT_MODE, password, salt, iterationCount);
        CipherInputStream cIn = new CipherInputStream(dIn, cipher);

        Digest dig = new SHA1Digest();
        DigestInputStream  dgIn = new DigestInputStream(cIn, dig);

        this.loadStore(dgIn);

答案 2

在 JKS 或 BKS 密钥库上,密码并非毫无意义,但它也不会执行您可能认为的那样。

它不会加密密钥库中的数据或以任何方式阻止对它的访问,但它确实验证了密钥库的完整性。如果不知道密码,就无法在没有正常用户发现的情况下对密钥库进行更改(通常是由于他们的工具告诉他们“密钥库被篡改,或者密码不正确”)

在其他一些密钥库类型(如 Keystore.BouncyCastle)中,密钥库密码可防止检查和篡改。


推荐