Java 使用密钥库存储密钥

Java 使用密钥库存储密钥,java,security,encryption,cryptography,password-protection,Java,Security,Encryption,Cryptography,Password Protection,我正在使用keystore保护文件中的私钥(使用该文件的密码)。我不理解此代码 // save my secret key javax.crypto.SecretKey mySecretKey; KeyStore.SecretKeyEntry skEntry = new KeyStore.SecretKeyEntry(mySecretKey); ks.setEntry("secretKeyAlias", skEntry, new KeyStore.PasswordProtect

我正在使用keystore保护文件中的私钥(使用该文件的密码)。我不理解此代码

// save my secret key
javax.crypto.SecretKey mySecretKey;
KeyStore.SecretKeyEntry skEntry =
    new KeyStore.SecretKeyEntry(mySecretKey);
ks.setEntry("secretKeyAlias", skEntry, 
    new KeyStore.PasswordProtection(password));

// store away the keystore
java.io.FileOutputStream fos = null;
try {
    fos = new java.io.FileOutputStream("newKeyStoreName");
    ks.store(fos, password);
} finally {
    if (fos != null) {
        fos.close();
    }
}
setEntry在做什么?? 我们是否通过fileoutputstream保存私钥?如果为真,文件的密码在哪里???
文件的扩展名是什么?是.jks吗?

Java密钥库是加密对象的容器。它可以包含对称密钥、私钥和证书。该方法向密钥库添加另一个条目。在您的情况下,它会将一个由“secretKeyAlias”标识并受密码保护的对称密钥添加到密钥存储中。如果要保存私钥,则应该创建一个
密钥库.PrivateKeyEntry

在内存中创建密钥库后,可以将其存储在磁盘上。密钥库有一个,它将密钥库写入
。在这种情况下,
FileOutputStream
。密钥库中还添加了一个由密码保护的密钥。在您的情况下,密码与上面使用的密码相同,但这不是必需的


Java密钥库通常的扩展名是.jks,但您的代码只是将其存储在一个名为“newkeystername”的文件中。

谢谢您的回答..我有一个疑问..在setEntry中--“skentry”是我们的条目(我们的输入,可能是任何类型的密钥),第三个参数是文件的密码,其中“skentry”是的,第二个参数是条目-在您的情况下,它应该是PrivateKeyEntry。第三个参数指定应如何保护条目。如果指定PasswordProtection,将使用密码对其进行加密。文件本身不加密(仅MACced),但每个条目都可以用密码加密。感谢您的回答Rasmus Faber,但我被困在这里,ks.setEntry(“d1”,prvate,new KeyStore.PasswordProtection(pass));d1-->是别名,prvate-->KeyStore.PrivateKeyEntry prvate=new KeyStore.PrivateKeyEntry(pr,null)(pr是来自密钥对生成器的私钥);我得到了空指针异常,因为第二个参数应该是chain(一个证书数组),但我的代码中没有使用任何证书…解决方案是什么…@user1168647:很抱歉,但我不相信您可以在Java密钥库中存储没有证书的私钥。我不知道这项限制背后的原因。您可能想问另一个关于最佳解决方案的问题,但我认为您的选项是a)使用另一种存储机制b)创建一个自签名证书以使用私钥存储。请回答注释..我只得到对我的问题(已发布)的答案,而不是对我的注释(如果有)的答案。。。