Android:无法使用密码保护条目

时间:2014-12-19 22:58:31

标签: java android security cryptography rsa

我试图将密钥对存储到Android的密钥库中。到目前为止,我有这个测试代码:

KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA");
keygen.initialize(2048);
KeyPair keypair = keygen.generateKeyPair();
PrivateKey priv = keypair.getPrivate();
PublicKey pub = keypair.getPublic();
String passwd = "Insert some strong password here.";
Certificate[] certChain = new Certificate[1];
certChain[0] = generateCertificate(keypair);
ks.setKeyEntry("test", priv, passwd.toCharArray(), certChain);

generateCertificate方法正在使用Bouncy Castle库。

当我运行此代码时,我得到java.security.KeyStoreException: entries cannot be protected with passwords

这是stange,因为setKeyEntry确实有密码参数。 我怎么能摆脱这个?并且使用存储在应用程序源代码中的强字符串密码是否安全?

感谢。

1 个答案:

答案 0 :(得分:1)

显然,尽管该方法采用了密码参数,AndroidKeystore实现不支持此功能,请查看the source中的第200行。

在任何情况下,密码,无论是强还是弱,都存储在设备的任何地方都是不安全的。这是源代码的尤其 true(包括一般的源代码,非android上下文)。如果我开始使用您应用的APK,我可以使用几种优秀的APK分析工具之一来访问该类的常量池,该池将包含纯文本密码。没有多少混淆可能会阻止这种情况,甚至使其变得更加困难。这可能是AndroidKeystore实施不允许这样做的原因。

Android设备上的密钥存储服务的全部要点(它实际上是作为一个可以通过unix套接字与之交谈的独立进程实现)是通过要求用户密码解锁来保护对敏感资料的访问因此,在你的密钥对或其他秘密上设置密码是没有意义的。在最近的手机中,这一切都在硬件中得到了体现,这提供了非常强大的安全性。