2013-11-20 5 views
19

메시지를 암호화/해독하고 인터넷을 통해 보내는 간단한 메시징 android 응용 프로그램을 만드는 동안 RSA 공개 키/개인 키 암호화를 사용하기로 결정했습니다. 문제는 개인 키를 저장하는 방법입니다. 따라서 전화가 악의적으로 뿌리를 내렸을지라도 키는 안전하게 유지됩니다. 내가 아는 한, KeyStore는 인증서에 사용되며이를 위해 사용할 수 없습니까? 개인 키를 AES로 텍스트 파일로 암호화해야합니까? 나는 보안에 대한 경험이 거의 없으므로 제 생각을 바꿔 자유롭게 의견을 말하십시오!RSA 비공개 키 저장 안드로이드

종류 감사합니다.

+3

@LokiSinclair @LokiSinclair @ 공개 키를 좋아하는 사람에게 공개 키를 공개하여 좋아하는 사람에게 공개 할 수 있습니다. 그래서 개인 키로 저장하는 것이 좋습니다. 개인 키는 안전한 장소에 보관하면됩니다. – Peanut

+0

@LokiSinclair 죄송합니다.하지만 그것은 틀 렸습니다. 개인 키는 메시지를 해독 할 수 있어야하는 장치에 저장하는 것이 가장 좋습니다. 백업은 온라인으로 만들 수 있지만 보안 상 위험 할 수 있습니다. 또한 공개 키를 개인 키와 동일한 위치에 저장해도 아무런 위험이 없습니다. – joakimb

답변

8

키 스토어를 사용하는 것이 적합 할 수 있다고 생각합니다. RSA 키를 저장할 수 있고 AES를 사용하여 암호화하므로 루트 액세스가 있어도 암호 나 브루투 링 없이는 추출 할 수 없습니다.

여기에 키 스토어를 사용하는 방법에 대한 좋은 게시물있다 : http://nelenkov.blogspot.fr/2012/05/storing-application-secrets-in-androids.html

+0

답장을 보내 주셔서 감사합니다. 링크 된 블로그는 매우 유용합니다. 암호 기반 암호화에 관한 게시물이 있는데, 적어도 내 응용 프로그램에서는 KeyStore에 의존하는 것보다 더 적절하고 바람직한 것으로 나타났습니다. 다시 감사합니다! – user32981

3

당신은 안드로이드에 SharedPreference를 사용하여 RSA 공개/개인 키를 지속 할 수는. 전화가 악의적으로 뿌리를 질렀을 때 키를 안전하게 유지하려면 다음 단계를 수행하십시오.

1 : 데이터를 암호화하려면 키 쌍을 생성하십시오.
2 : 사용자에게 암호를 묻습니다.
3 :이 암호를 사용하여 개인 키를 암호화하는 대칭 키를 생성하십시오.
4 : 공개 키를 사용하여 데이터를 암호화하고 개인 키를 사용하여 암호를 해독 할 수 있습니다.
5 단계 2에서 프롬프트 된 암호에 대한 세션을 유지할 수 있습니다.이 세션 동안 개인 키를 암호화/해독하기 위해 대칭 키 (암호에서 생성 된)를 사용할 수 있습니다.

다음 코드

다음 코드는 & 개인 키를 가져 저장하는 방법을 보여줍니다 & 공개 키

public void setPublicKey(PublicKey publicKey, String key, Context context) { 

    byte[] pubKey = publicKey.getEncoded(); 
    String pubKeyString = Base64.encodeBytes(pubKey); 
    this.setString(key, pubKeyString, context); 
} 

public PublicKey getPublicKey(String key,Context context) { 

    PublicKey pKey = null; 
    try { 

     String pubString = this.getString(key, context); 

     if(pubString!=null) { 
      byte[] binCpk = Base64.decode(pubString); 
      KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
      X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(binCpk); 
      pKey = keyFactory.generatePublic(publicKeySpec); 
     } 
     }catch(Exception e){ 
    } 
    return pKey; 
} 

가져 저장하는 방법을 보여줍니다.

public void setPrivateKey(PrivateKey privateKey, String key, Context context) { 

    byte[] priKey = privateKey.getEncoded(); 
    String priKeyString = Base64.encodeBytes(priKey); 
    this.setString(key, priKeyString, context); 
} 

public PrivateKey getPrivateKey(String key, Context context) { 

    PrivateKey privateKey = null; 

    try { 
     String privateString = this.getString(key, context); 
     if(privateString!=null){ 
      byte[] binCpk = Base64.decode(privateString); 
      KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
      PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(binCpk); 
      privateKey = keyFactory.generatePrivate(privateKeySpec); 
     } 
    } 
    catch(Exception e){ 
    } 
    return privateKey; 
} 
+4

개인 키에는 사용하지 마십시오. 외모보다 ​​낫게하는 것이 더 힘듭니다. 내장 된 키 스토어 API (Android 4.3 이상에서 사용 가능)를 사용하거나 일반 'KeyStore' (BKS/JKS)를 사용하여 키와 인증서를 저장하십시오. 형식에는 무결성 보호 및 암호화가 있으며 암호로 보호 할 수 있습니다. –

+0

나는 set 메소드에서 키를 인코딩한다고 말하고 있습니까? – Karoly

2

파일 시스템의 키 스토어 (P12, JKS, AKS)는 RSA 비공개 키를 보관할만큼 안전하지 않습니다. 스마트 카드 또는 보안 토큰 만 높은 수준의 보안을 제공 할 수 있습니다. 이 책의 내용 : "안드로이드 보안 내부". 이 책에서는 Android 보안 및 JCA 공급자에 대한 설명을 제공합니다.

+2

"Android Security Internals"의 저자는 자신의 키와 인증서를 저장하기 위해 "일반"KeyStore (BKS/JKS)를 사용하는 것이 좋습니다.이전 답변의 의견을 읽으십시오. 추천 정보가 유효합니다. Nikolay Elenkov의 아주 좋은 책과 블로그. – jfuentes

관련 문제