如何在没有密码的情况下在私钥中存储私钥

时间:2013-07-02 11:50:35

标签: android security keystore private-key pin-code

我是Android和安全新手。

我的应用使用加密的数据库,该数据库由私钥加密。我想找到一种方法将这个私钥存储在受保护的地方,而无需添加任何额外的密码/密码。

从我所读到的,Android的密钥库就是这样做的地方,但从我的理解,如果我将使用它,它要求我为设备设置一个密码(我不会想做!)。

有关存储此密钥的位置以及如何存储的任何建议? (任何与密钥库相关的解决方案都是可以接受的,只要我不必设置密码)

我的方向是使用一些外部开源密钥库(任何建议?),我将作为我的应用程序的一部分进行编译(并且因为android不会在应用程序之间共享信息,所以可以使用)。

我知道使用root设备时我的最后一个假设是不正确的,但对于我的情况,我只使用非root设备。

我搜索了很多(这里和其他地方)并找不到我想要的东西......

任何帮助都非常感谢!! 10X

1 个答案:

答案 0 :(得分:1)

您需要记住的一件事是,在API 14之前KeyChain不可用。如果您打算定位早期的API版本,则需要其他选项。您可以使用SpongyCastle创建自己的KeyStore。

如果您不打算要求用户输入密码,您至少应该隐藏密码。

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        KeyStore ks = null;
        try {
            ks = KeyStore.getInstance(KeyStore.getDefaultType());
            ks.load(null,null);

            // Add certs or keys

            ks.store(new FileOutputStream(new File(getFilesDir(),"out.bks")),"password".toCharArray());
        } catch (KeyStoreException e) {
            e.printStackTrace();
        } catch (CertificateException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    static {
        Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);
    }
}