Java 存储私钥是否可能是安全的?

Java 存储私钥是否可能是安全的?,java,ssl,public-key-encryption,private-key,jks,Java,Ssl,Public Key Encryption,Private Key,Jks,这个问题是关于我的一个项目。我有一个服务器端应用程序在我的Raspberry Pi上运行,而客户端应用程序应该分布在我的所有其他设备上。下面的exzerpt显示了客户端的代码 我一直在互联网上挖掘,我收集到的信息是,最终没有100%安全的方式来存储私钥。但是,保护密钥库中的所有密钥被认为是良好的做法。下面是我的解决方案,但我的问题是:密钥库文件,client.jks,与硬编码密码一起位于JAR内client.jks包含服务器端的公钥和客户端的私钥 KeyStore keyStor

这个问题是关于我的一个项目。我有一个服务器端应用程序在我的Raspberry Pi上运行,而客户端应用程序应该分布在我的所有其他设备上。下面的exzerpt显示了客户端的代码

我一直在互联网上挖掘,我收集到的信息是,最终没有100%安全的方式来存储私钥。但是,保护密钥库中的所有密钥被认为是良好的做法。下面是我的解决方案,但我的问题是:密钥库文件
client.jks
与硬编码密码一起位于JAR内
client.jks
包含服务器端的公钥和客户端的私钥

        KeyStore keyStore = KeyStore.getInstance("JKS");
        keyStore.load(new FileInputStream(KEYSTORE), PASSWORD.toCharArray());

        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
        keyManagerFactory.init(keyStore, PASSWORD.toCharArray());

        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
        trustManagerFactory.init(keyStore);

        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());

        SSLSocket connection = (SSLSocket) sslContext.getSocketFactory().createSocket("localhost", 6789);
        System.out.println("Connection successful!");
字符串
KEYSTORE
PASSWORD
包含密钥库文件和密码,两者都是硬编码的。 这真的是最佳实践还是我遗漏了什么?为每个连接创建的新
SecureRandom
对象是否足以确保连接安全


最好的问候,谢谢你的回答

FileInputStream
无法访问jar条目;如果您确实想要jar中的jks,您需要
ClassLoader.getResourceAsStream
,请参阅关于该主题的大约一千个现有Qs。您是否希望在jar中使用客户端密钥和密码取决于您试图针对什么威胁模型实现什么安全目标,而您的Q对此只字未提。您是否担心有人窃取您的应用程序副本或破坏包含该应用程序的计算机连接到您的服务器?那些不喜欢的人呢?您知道并关心哪个用户或机器是哪个吗?如果密钥库的密码在您的代码中,这与未受保护的密钥库具有基本相同的安全级别,因为访问jar文件的每个人都可以提取密钥库密码,从而访问客户机的私钥。正如@dave_thompson_085所指出的,您需要什么取决于您的威胁场景。一般来说,试图保护应用程序分发的关键材料的每种方法都主要是蛇油。