Java Android密钥库系统-保存密钥对?
我目前正试图在我的Android应用程序中整合一个功能正常的密钥库实现。我目前的API最低为18,这样我就可以充分利用我的应用程序的私有Java Android密钥库系统-保存密钥对?,java,android,encryption,android-keystore,Java,Android,Encryption,Android Keystore,我目前正试图在我的Android应用程序中整合一个功能正常的密钥库实现。我目前的API最低为18,这样我就可以充分利用我的应用程序的私有密钥库。我正在尝试生成n个KeyPair对象,并将它们保存在密钥库中以供以后检索。我已经看过了,但是它似乎有点过时(2012年),并没有很好地回答任何问题。老实说,我在Stack Overflow上发现的大多数问题似乎都非常过时,比如和 因此,我的预期流程是: 尝试从与相应别名对应的证书检索公钥 如果此公钥为空,请创建一个新密钥 利用KeyPairGenerat
密钥库。我正在尝试生成n
个KeyPair
对象,并将它们保存在密钥库中
以供以后检索。我已经看过了,但是它似乎有点过时(2012年),并没有很好地回答任何问题。老实说,我在Stack Overflow上发现的大多数问题似乎都非常过时,比如和
因此,我的预期流程是:
尝试从与相应别名对应的证书检索公钥
如果此公钥为空,请创建一个新密钥
利用KeyPairGenerator.getInstance(“RSA”、“AndroidKeyStore”)代码>
生成密钥对
到目前为止,一切都非常简单,运行良好。下一步是它变得多毛的地方
保存密钥对。通过KeyStore.getInstance(“AndroidKeyStore”)初始化密钥库代码>
尝试通过X509V3CertificateGenerator
生成X509Certificate
。此证书是自签名的。对于证书,我将签名算法设置为“sha1withrsa加密”
最后,调用keyStore.setKeyEntry
对于最后一步,似乎有两种选择:
keyStore.setKeyEntry(字符串别名、字节[]密钥、证书[]链)代码>
或
keyStore.setKeyEntry(字符串别名、密钥、字符[]密码、证书[]链)代码>
我从两个中的第二个开始,但收到了java.security.KeyStoreException:entries不能用密码保护
。。。。好吧,这很奇怪,为什么会有一个方法保证抛出异常?我们试试1号门
此时,当我调用setKeyEntry并将keyPair.getPrivate().getEncoded()作为第二个参数传递时,我从系统接收到java.security.KeyStoreException:操作不受支持,因为密钥编码未知
所以我有点不知所措。像这样的加密对我来说是比较新的,所以我希望有人能解释一下非常混乱的情况,那就是Android密钥库系统。所以我找到了答案-希望这将有助于为未来的用户保存一些问题,因为文档中没有明确列出
KeyPairGeneratorSpec.Builder
有一个方法setAlias
。生成密钥时,它会自动存储在此别名下的密钥库中。不需要额外的储蓄来让它工作。然后,您可以使用与KeyPairGenerator相同的字符串提供程序来实例化密钥库,从而轻松检索这些密钥。我正试图将PKCS12文件(例如由用户手动下载)导入AndroidKeyStore。看来
keyStore.setKeyEntry(String alias, byte[] key, Certificate[] chain);
不是由AndroidKeyStore实现的,它始终引发以下异常:
KeyStoreException("Operation not supported because key encoding is unknown")
参考:
所以,我试着使用
keyStore.setKeyEntry(String alias, Key key, char[] password, Certificate[] chain);
通过将密码传递为null。这对我很管用
keyStore.setKeyEntry(String alias, Key key, char[] password, Certificate[] chain);