如何在Android中存储私钥而无需PIN码

4
我是一名新手,对于安卓和安全方面知识不熟悉。
我的应用程序使用加密的数据库,该数据库由私钥加密。我想找到一种方法将此私钥存储在受保护的位置中,而不需要添加任何额外的密码或 PIN 码。
据我了解,安卓的 keystore 就是用来存储私钥的地方,但依照我的理解,如果我要使用它,它会要求我为设备设置 PIN 码(这是我不想做的!)。
请问有关于存储此密钥的建议吗? (只要不需要设置 PIN 码,与 keystore 相关的任何解决方案都可以接受)
我的想法是使用某些外部开源 keystore (有什么建议吗?),然后将其编译为我的应用程序的一部分(因为安卓不会在应用之间共享信息,所以这样做是可以的)。
我知道,当使用 root 设备时,我的最后一个假设是不正确的,但在我的情况下,我只使用未 root 的设备。
我已经在这里和其他地方搜索了很多,但没有找到我要找的内容...
非常感谢您的帮助!!
1个回答

1

需要记住的一件事是,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);
    }
}

没错,我也在针对早期的API版本……我不仅想要隐藏私钥,而是真正地保护它。我知道这只能通过用户输入密码来实现。我对此没有任何问题,只要不是每次都需要(比如PIN码)。所以再次确认——我认为我需要一个外部密钥库解决方案……谢谢。 - krushi
获取密钥后,您可以将密钥或密码缓存到内存中。 - Frohnzie
首先,非常感谢您的帮助,非常感激!我认为将其保存在内存中不是一个好主意,因为当我的应用程序进入后台时,Android 可能会杀死它,并且下次我进入它时,恢复它时没有这些数据在内存中...那么最重要的是 - 我可以使用哪个外部“密钥库”(或对此事 - 受保护的存储)?再次感谢您! - krushi
如果您希望在活动之间保留密钥,可以将其存储在应用程序上下文中。如果应用程序被杀死,用户只需重新输入密码即可。否则,您应该使用Android密钥库。 - Frohnzie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接