首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >系统在尝试创建.jks文件时找不到指定的文件

系统在尝试创建.jks文件时找不到指定的文件
EN

Stack Overflow用户
提问于 2018-06-01 02:41:55
回答 1查看 959关注 0票数 -1

我目前正在学习Java的加密/解密技术,我遇到的一个主要问题是将密钥存储在.jks文件中,并能够在不同的启动过程中加载它。在我的调用类中,它调用构造函数,下面是它的代码:

代码语言:javascript
复制
public Encrypt_Decrypt() throws NoSuchAlgorithmException, NoSuchPaddingException
{
    Cipher cipher = Cipher.getInstance("AES");
    SecureRandom randomSecureRandom = SecureRandom.getInstance("SHA1PRNG");
    byte[] iv = new byte[cipher.getBlockSize()];
    randomSecureRandom.nextBytes(iv);
    IvParameterSpec ivParams = new IvParameterSpec(iv);
    ivSpec = ivParams;

    SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey();
    byte[] keyBytes = secretKey.getEncoded();
    SecretKeySpec sks = new SecretKeySpec(keyBytes, "AES");
    key = sks;
    KeyStore.SecretKeyEntry entry = new KeyStore.SecretKeyEntry(key);
    KeyStore.ProtectionParameter protParam = new KeyStore.PasswordProtection("password".toCharArray());
    try
    {
        File f = new File("keystore.jks");
        KeyStore keyStore = KeyStore.getInstance("JKS");
        java.io.FileInputStream fis = null;
        try
        {
            fis = new java.io.FileInputStream("keystore");
        }
        finally
        {
            if (fis != null)
            {
                fis.close();
            }
        }
        keyStore.load(fis, "password".toCharArray());

        keyStore.setEntry("key", entry, protParam);

        try (FileOutputStream fout = new FileOutputStream(f))
        {
            keyStore.store(fout, "password".toCharArray());
            ;
        }
    }
    catch (Exception e)
    {
        System.out.println(e.getMessage());
    }
}

在调用类中启动此代码后,它返回的错误如下:keystore (The system cannot find the file specified)

在我的代码中,我创建了文件,那么为什么它会有问题呢?我查看了我的项目文件夹,它没有保存在那里,那么我必须做什么才能创建、存储和使用这个文件,而不会出现问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-01 06:04:44

keystore (The system cannot find the file specified)消息与此行相关:

代码语言:javascript
复制
new java.io.FileInputStream("keystore");

看起来应该一直在使用File f吧?类似于下面处理FileOutputStream的方式工作得很好:

代码语言:javascript
复制
try (FileInputStream fis = new FileInputStream(f)) {
    keyStore.load(fis, "password".toCharArray());
}

作为参考,还有另一个错误等待着你。尝试在JKS密钥库中存储AES对称密钥会导致以下错误:

代码语言:javascript
复制
java.security.KeyStoreException: Cannot store non-PrivateKeys
    at sun.security.provider.JavaKeyStore.engineSetKeyEntry(JavaKeyStore.java:258)
    at sun.security.provider.JavaKeyStore$JKS.engineSetKeyEntry(JavaKeyStore.java:56)
    at java.security.KeyStoreSpi.engineSetEntry(KeyStoreSpi.java:550)
    at sun.security.provider.KeyStoreDelegator.engineSetEntry(KeyStoreDelegator.java:179)
    at sun.security.provider.JavaKeyStore$DualFormatJKS.engineSetEntry(JavaKeyStore.java:70)
    at java.security.KeyStore.setEntry(KeyStore.java:1557)
    at KeystoreTest.main(KeystoreTest.java:44)

这是因为JKS存储类型只支持公钥/私钥- also here

有了新的JCEKS密钥库,示例代码就可以正常工作了:

代码语言:javascript
复制
File f = new File("keystore.jceks");
KeyStore keyStore = KeyStore.getInstance("JCEKS");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50630811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档