java - 存储/检索椭圆曲线加密 (ECC) 公钥和私钥

标签 java android

我必须编写代码来生成 ECC key 对。

然后我用公钥加密字符串,用私钥解密。

现在我通过将 key 对写入 pem 文件并存储在外部存储器中来存储它。

这似乎不安全。

那么如何存储和检索这些 key 呢?

这是我生成 key 对并写入 pem 文件的代码:

btnGenKey.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("prime256v1");
            try {
                KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA","SC");
                g.initialize(spec, new SecureRandom());
                KeyPair keyPair = g.generateKeyPair();
                privateKey = keyPair.getPrivate();
                publicKey = keyPair.getPublic();
                Toast.makeText(MainActivity.this, "GEN KEY SUCCESS!!", Toast.LENGTH_SHORT).show();
                String state;
                state = Environment.getExternalStorageState();
                if(Environment.MEDIA_MOUNTED.equals(state))
                {
                    File root = Environment.getExternalStorageDirectory();
                    File dir = new File(root.getAbsolutePath()+"/EDCSA1");
                    if(!dir.exists())
                    {
                        dir.mkdir();
                    }
                    File pub = new File(dir,"pub.pem");
                    File prv = new File(dir,"pri.pem");
                    try
                    {
                        FileOutputStream fileOutputStream = new FileOutputStream(pub);
                        StringWriter writer = new StringWriter();
                        PemWriter pemWriter = new PemWriter(writer);
                        pemWriter.writeObject(new PemObject("PUBLIC KEY",publicKey.getEncoded()));
                        pemWriter.flush();
                        pemWriter.close();
                        String publickeyPem = writer.toString();
                        fileOutputStream.write(publickeyPem.getBytes());
                        fileOutputStream.close();
                        Toast.makeText(MainActivity.this, "SAVE PUBLICKEY", Toast.LENGTH_SHORT).show();
                        ///
                        FileOutputStream fileOutputStream2 = new FileOutputStream(prv);
                        StringWriter writer2 = new StringWriter();
                        PemWriter pemWriter2 = new PemWriter(writer2);
                        pemWriter2.writeObject(new PemObject("PRIVATE KEY",privateKey.getEncoded()));
                        pemWriter2.flush();
                        pemWriter2.close();
                        String privatekeyPem = writer2.toString();
                        fileOutputStream2.write(privatekeyPem.getBytes());
                        fileOutputStream2.close();
                        Toast.makeText(MainActivity.this, "SAVE PRIVATE", Toast.LENGTH_SHORT).show();
                    }
                    catch (Exception ex)
                    {
                        ex.printStackTrace();
                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

最佳答案

我不建议使用 pem 文件。在 Android 中存储您的 secret 信息的最佳方式是在 keystore 中,因为它非常安全。阅读更多关于 keystore 的信息 here .

如果您正在寻找要应用的密码转换,请引用this因为它包含您可以使用的算法和密码转换列表。

这里是关于如何使用所有这些的一般概念。

1) 初始化 keystore ,生成 key 对(公钥和私钥)
2) 加密您的字符串并将其存储在存储中(共享首选项、数据库等)
3)从存储中获取加密的字符串并解密以供您使用。

UPDATE :Examples

如果你想要一个完整的工作,请引用这些例子 1) https://developer.android.com/training/articles/keystore.html 2) http://www.androidauthority.com/use-android-keystore-store-passwords-sensitive-information-623779/

关于java - 存储/检索椭圆曲线加密 (ECC) 公钥和私钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46408720/

相关文章:

css - UTF-8 不适用于某些 Android 设备

android - 最初在列表中不可见时未选中 MultiSelectListPreference 复选框(API 23)

java - 如何使用 SSL JDBC 连接到 MySQL 服务器

java - 为什么我们应该将接口(interface)方法声明为公共(public)的?

java - 服务中的线程由于某种原因而终止*

java - json volley 显示错误 android

javascript - 使用 jspdf 将 html 转换为 pdf 时,TypeError : pdf. fromHTML 不是函数

java - 带有 Java API 的 Amazon S3 和 Cloudfront

安卓 KitKat : android. view.InflateException : Error inflating class android. support.design.widget.NavigationView

java - (Android)通过intent传递多维数组