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

标签 android security keystore private-key pin-code

我是 Android 和安全方面的新手。

我的应用程序使用由私钥加密的加密数据库。我想找到一种方法将这个私钥存储在一个 protected 地方,而不添加任何额外的密码/pin 码。

根据我的阅读,Android 的 keystore 是执行此操作的地方,但根据我的理解,如果我要使用它,它要求我为设备设置一个 pin 码(我没有想做!)。

关于在哪里存储这个 key 以及如何存储有什么建议吗? (只要我不需要设置密码,任何与 keystore 相关的解决方案都是可以接受的)

我的方向是使用一些外部开源 keystore (有什么建议吗?),我会将其编译为我的应用程序的一部分(并且因为 android 不在应用程序之间共享信息,所以可以使用)。

我知道在使用 root 设备时我最后的假设是不正确的,但就我而言,我只使用非 root 设备。

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

非常感谢任何帮助!! 10倍

最佳答案

您需要记住的一件事是,KeyChain 在 API 14 之前不可用。如果您打算针对较早的 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);
    }
}

关于android - 如何在没有密码的情况下在android中存储私钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17424861/

相关文章:

java - 如何将 PKCS12 证书导入 Java keystore ?

android - 从对话框调用异步任务

android - 在 Recyclerview 中点击一个项目会影响每七个项目吗?

android - 为我没有源代码的应用程序禁用 WAL?

java - 从签名的 Java 小程序安全地请求网页

java - 创建 PKCS#7 分离签名

java - 没有虚方法 getLayoutInflater

security - 为什么火谢帕德要杀死火羊?

security - 如何在同一(但不断变化的)IP 地址上处理 2 个不同主机的 ssh 主机 key 验证?

java - 确定 keystore 类型是 pkcs12 还是 jks(以编程方式)