2017-09-25 107 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很高興我能幫到你 –