2015-11-17 14 views
23

sto cercando di cifrare e decifrare il nome utente in applicazione utilizzando KeyStore,Crittografia e decodifica del nome utente utilizzando KeyStore in Android M e versione precedente?

Utilizzando KeyPairGeneratorSpec per creare la chiave nella versione precedente, come da 18 a 22,

KeyPairGeneratorSpec come stato depricated nella versione 23 di Android M, Ma Android M supporta KeyGenParameterSpec.

Questo KeyGenParameterSpec supporta la comparabilità a ritroso o come faccio?

Sto provando qualcosa del genere, c'è una soluzione migliore per questo. Funziona come adesso!

Al momento di Ciper.getInstance in crittografia e decifrazione ho bisogno di fare questo. c'è un singolo parametro "RSA/ECB/OAEPWithSHA-256AndMGF1Padding" o "RSA/ECB/PKCS1Padding" posso passare sia per la versione?

if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){ 
      c = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); 
     }else{ 
      c = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
     } 

Sotto codice funziona bene come fuori ora, fammi sapere come posso migliorare questo.

Key Generator:

genkey(){ 
KeyPairGenerator generator = KeyPairGenerator .getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore"); 
      if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){ 
       TCLog.e(TAG,"Current version is 23(MashMello)"); 
       //Api level 23 

       KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
          keyName, 
          KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT) 
          .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512) 
          .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP) 
          .build(); 
       generator.initialize(spec); 
      }else{ 
       TCLog.e(TAG,"Current version is < 23(MashMello)"); 
       //api level 17+ 4.4.3 
       KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(getActivity()) 
         .setAlias(keyName) 
         .setSubject(new X500Principal("CN=Sample Name, O=Android Authority")) 
         .setSerialNumber(BigInteger.ONE) 
         .setStartDate(start.getTime()) 
         .setEndDate(end.getTime()) 
         .build(); 
       generator.initialize(spec); 
      } 
      KeyPair keyPair = generator.generateKeyPair(); 
} 

codice di crittografia:

doEncription(){ 
try { 
     KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(keyName, null); 
     PublicKey publicKey = (PublicKey) privateKeyEntry.getCertificate().getPublicKey(); 
     Cipher c; 
     if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){ 
      c = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); 
     }else{ 
      c = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
     } 

     c.init(Cipher.ENCRYPT_MODE, publicKey); 
     encodedUser = c.doFinal(userName.getBytes()); 
     encodedPassword = c.doFinal(userPassword.getBytes()); 

     userName = Base64.encodeToString(encodedUser, Base64.DEFAULT); 
     userPassword = Base64.encodeToString(encodedPassword, Base64.DEFAULT); 
     // Log.e("MainActivity","AES Encription Error.!"); 
    } catch (Exception e) { 
     Log.e("MainActivity", "AES Encription Error.!"); 
    } 
} 

Codice decrittografia:

doDecryption(){ 
    try { 
     KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(keyName, null); 
     PrivateKey privateKey = (PrivateKey) privateKeyEntry.getPrivateKey(); 

     Cipher c; 
     if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){ 
      c = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); 
     }else{ 
      c = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
     } 
     c.init(Cipher.DECRYPT_MODE, privateKey); 
     decodedUser = c.doFinal(encodedUser); 
     decodedPassword = c.doFinal(encodedPassword); 

    } catch (Exception e) { 
     Log.e("MainActivity", "AES Decryption Error.!"); 
    } 

} 
+0

@ nikolay-elenkov potresti per favore dare un'occhiata veloce a questo codice? è sicuro per la cifratura dei dati sensibili? – deviant

+1

puoi dirmi un link dove posso trovare il codice completo o dove ottieni il codice? –

risposta

3

la trasformazione cifra dipende da quali parametri si dà per KeyGenParameterSpec o KeyPairGeneratorSpec. Se si desidera utilizzare "RSA/ECB/PKCS1Padding" in entrambi i casi (Android M e sotto) cambiano

spec.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP) 

a

spec.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1) 

È possibile verificare che gli algoritmi sono disponibili con il seguente pezzo di codice:

Provider[] providers = Security.getProviders(); 
    for (Provider p : providers) { 
     Log.d(TAG, "provider: " + p.getName()); 
     Set<Provider.Service> services = p.getServices(); 
     for (Provider.Service s : services) { 
      Log.d(TAG, "--> algorithm: " + s.getAlgorithm()); 
     } 
    } 

Ho evitato di scrivere molto if-else dichiarando un'interfaccia IKeyStoreHandler che fornisce tutti i metodi necessari (aggiungi/rimuovi tasti, elenca tutti chiavi con i loro alias, ottenere la chiave privata/pubblica, decodificare/cifrare il testo) e implementarla per entrambi i casi.

Problemi correlati