2013-11-20 23 views
19

Mesajları şifrelemek/şifrelemek ve internetten göndermek için basit bir mesajlaşma uygulaması olan android uygulaması sırasında, RSA public/private anahtar şifrelemeyi kullanmaya karar verdim. Soru özel anahtarın nasıl saklanacağıdır, böylece telefon kötüye kullanıldığında bile anahtar güvenli kalır mı? Anladığım kadarıyla, KeyStore sertifikalar için kullanılıyor ve bunun için kullanılamaz mı? Özel anahtarı AES ile metin dosyası olarak şifrelemeli miyim? Güvenlik konusunda çok az tecrübem var, bu yüzden lütfen fikirlerimi düzeltmekten çekinmeyin ve fikrinizi verin!RSA Özel Anahtarını Kaydetme Android

Saygılarımızla.

+3

@LokiSinclair İstediğiniz yerde herkese açık anahtarı koyabilirsiniz ve istediğiniz herkese gösterebilirsiniz, bu yüzden bu halka açıktır. Yani özel anahtar ile saklamak iyidir. Özel anahtarı güvenli bir yerde saklamanız yeterlidir. – Peanut

+0

@LokiSinclair Üzgünüz ama bu yanlış. Özel anahtarlar, mesajların şifresini çözebilecek en iyi cihazda saklanır. Yedeklemeler çevrimiçi yapılabilir, ancak bu bir güvenlik riski oluşturur. Ayrıca, genel anahtarın, özel anahtarla aynı yerde saklanmasında herhangi bir risk yoktur. – joakimb

cevap

8

Bence KeyStore kullanımınıza uygun olabilir. RSA anahtarlarını saklayabilir ve AES kullanarak bunları şifreleyebilir, böylece root erişimi bile olsa, şifre veya bruteforcing olmadan ayıklanamazlar.

burada anahtar deposunu kullanma konusunda iyi bir mesaj var: http://nelenkov.blogspot.fr/2012/05/storing-application-secrets-in-androids.html

+0

Cevabınız için teşekkürler, bağlantı kurduğunuz blog çok kullanışlıdır! En azından benim uygulama için, KeyStore'a bağlı olarak daha uygun ve daha cazip bulduğum parola tabanlı şifreleme ile ilgili bir gönderi var. Tekrar teşekkürler! – user32981

3

Sen robot üzerinde SharedPreference kullanarak RSA ortak/özel anahtar devam edebilir. Telefon kötüye kullanıldığında, anahtarlarınızı güvende tutabilmek için aşağıdaki adımları gerçekleştirebilirsiniz:

1: Herhangi bir veriyi ne zaman arşivlemek istediğinizde bir anahtar çifti oluşturun.
2: Kullanıcıya bir parola sor.
3: Özel anahtarınızı şifrelemek için simetrik anahtar oluşturmak üzere bu parolayı kullanın.
4: Verilerinizi ortak anahtarı kullanarak şifreleyebilir ve özel anahtarı kullanarak şifresini çözebilirsiniz.
5: 2. adımda sorulan parola için bir oturumu saklayabilirsiniz. Bu oturum sırasında, özel anahtarı şifrelemek/şifresini çözmek için simetrik anahtarı (paroladan oluşturulur) kullanabilirsiniz.

Aşağıdaki kod parçası

Aşağıdaki kod parçası & özel anahtarı getir nasıl depolanacağı gösterir & genel anahtar

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; 
} 

getirme nasıl depolanacağı gösterir.

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

Lütfen özel anahtarlar için bunu yapma. Göründüğünden daha doğru olması zor. Anahtarlarınızı ve sertifikalarınızı saklamak için yerleşik anahtar deposu API'sini (Android 4.3+ sürümünde mevcut) kullanın ya da düzenli bir 'KeyStore' (BKS/JKS) kullanın. Format, bütünlük korumasına ve şifrelemeye sahiptir ve bir şifre ile korunabilir. –

+0

Sadece set yönteminde anahtarı kodladığını söylediğimde haklıyım? – Karoly

2

Dosya sistemindeki anahtar deposu (P12, JKS, AKS) hiçbiri RSA özel anahtarlarını tutmak için yeterli güvenli olamaz. Sadece SmartCard veya güvenli jetonlar yüksek düzeyde güvenlik sağlayabilir. Bu kitabı oku: "Android Security Internals". Bu kitapta Android Güvenlik ve JCA sağlayıcılarının iyi bir açıklamasını bulacaksınız.

+2

"Android Security Internals" ın yazarı, anahtarlarınızı ve sertifikalarınızı saklamak için "normal" KeyStore'u (BKS/JKS) kullanmanın kendisinin önerdiğini fark etmekte ilginçtir. "Sadece önceki cevaptaki yorumları okuyun. Yine de geçerli öneri geçerlidir. Nikolay Elenkov'dan çok iyi bir kitap ve blog. – jfuentes