2017-09-25 274 views
4

我必须编写代码来生成ECC密钥对。存储/检索椭圆曲线加密(ECC)公钥和私钥

然后我使用公钥对字符串进行加密并使用私钥进行解密。

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

这似乎并不安全。

那么如何存储和检索这些密钥? 提前致谢。

这里是我的代码来生成密钥对,并写入到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(); 
      } 
     } 
    }); 

回答

1

我不会建议PEM文件。在Android中存储您的秘密信息的最佳方法是在keystore中,因为它非常安全。阅读关于keystore here的更多信息。

如果您正在寻找密码转换来应用请参考this,因为它有一个您可以使用的算法和密码转换列表。

下面是关于如何使用所有这些的一般想法。

1)初始化一个密钥,生成密钥对(公钥和私钥)
2)加密你的字符串,并将其存储在存储器(共享偏好,DB等)
3)从存储获取的加密字符串和解密它供您使用。

UPDATE:例子

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

+0

当然,我不认为PEM文件是安全性好。我必须从链接中读取密钥库,但是不能给我例子中的示例代码。 – nistelrooy41001662

+0

i can,@ nistelrooy41001662查看我的更新回答 –

+0

谢谢@ nistelrooy41001662很高兴我能帮到你 –