Java Android密钥库系统-保存密钥对?

Java Android密钥库系统-保存密钥对?,java,android,encryption,android-keystore,Java,Android,Encryption,Android Keystore,我目前正试图在我的Android应用程序中整合一个功能正常的密钥库实现。我目前的API最低为18,这样我就可以充分利用我的应用程序的私有密钥库。我正在尝试生成n个KeyPair对象,并将它们保存在密钥库中以供以后检索。我已经看过了,但是它似乎有点过时(2012年),并没有很好地回答任何问题。老实说,我在Stack Overflow上发现的大多数问题似乎都非常过时,比如和 因此,我的预期流程是: 尝试从与相应别名对应的证书检索公钥 如果此公钥为空,请创建一个新密钥 利用KeyPairGenerat

我目前正试图在我的Android应用程序中整合一个功能正常的密钥库实现。我目前的API最低为18,这样我就可以充分利用我的应用程序的私有
密钥库。我正在尝试生成
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);