2016-03-31 22 views
1

Uygulamada, her yerde gizli (String) olmaya çalışıyorum, tasarruf et! Bu yüzden anahtar depolamak için anahtar deposunu kullanmak ve sırrımı sadece şifreleme ve şifremin şifresini çözmek için kullanmak fikrini buldum. Ben geri almak için deneyin nasıl buradaAndroid KeyStore şifreleme/şifre çözme için SecretKey'i saklamak için

 public static boolean setKeyStoreString(String strToStore, Context context) { 

      if (strToStore == null) return false; 
      if (strToStore.length() == 0) return false; 
      Log.e(TAG, strToStore); 
      try { 
       KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); 
       keyStore.load(null); 
       int nBefore = keyStore.size(); 
       // Create the keys if necessary 
       if (!keyStore.containsAlias("phrase")) { 
        KeyGenerator generator = KeyGenerator.getInstance(
          KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); 
        KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder("phrase", KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) 
          .setKeySize(256) 
          .setBlockModes(KeyProperties.BLOCK_MODE_CBC) 
          .setUserAuthenticationValidityDurationSeconds(-1) 
          .setRandomizedEncryptionRequired(false) 
          .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) 
          .setUserAuthenticationRequired(false) 
          .build(); 
        generator.init(spec); 
        generator.generateKey(); 
       } 
       int nAfter = keyStore.size(); 
       Log.v(TAG, "Before = " + nBefore + " After = " + nAfter); 


       String filesDirectory = context.getFilesDir().getAbsolutePath(); 
       String encryptedDataFilePath = filesDirectory + File.separator + "my_phrase"; 
    //   Log.v(TAG, "strPhrase = " + strToStore); 
    //   Log.v(TAG, "dataDirectory = " + dataDirectory); 
    //   Log.v(TAG, "filesDirectory = " + filesDirectory); 
    //   Log.v(TAG, "encryptedDataFilePath = " + encryptedDataFilePath); 

       SecretKey secret = (SecretKey) keyStore.getKey("phrase", null); 
       Cipher inCipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 
       inCipher.init(Cipher.ENCRYPT_MODE, secret); 
       CipherOutputStream cipherOutputStream = new CipherOutputStream(
         new FileOutputStream(encryptedDataFilePath), inCipher); 
       byte[] bytesToStore = strToStore.getBytes("UTF-8"); 

       cipherOutputStream.write(bytesToStore); 
       try { 
        cipherOutputStream.close(); 
       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } 
       return true; 
      } catch (Exception e) { 
       Log.e(TAG, Log.getStackTraceString(e)); 
      } 
      return false; 
     } 

ve geçerli:: İşte benim gizli (şifrelemek) kaydetmek nasıl

public static String getKeyStoreString(final Context context) { 

     KeyStore keyStore; 
     String recoveredSecret = ""; 
     String filesDirectory = context.getFilesDir().getAbsolutePath(); 
     String encryptedDataFilePath = filesDirectory + File.separator + "my_phrase"; 
     try { 
      keyStore = KeyStore.getInstance("AndroidKeyStore"); 
      keyStore.load(null); 
      SecretKey secretKey = (SecretKey) 
        keyStore.getKey("phrase", null); 
      if (secretKey == null) throw new RuntimeException("secretKey is null"); 

      Cipher outCipher; 
      outCipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 
      outCipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(
        new byte[outCipher.getBlockSize()])); 

      CipherInputStream cipherInputStream = new CipherInputStream(
        new FileInputStream(encryptedDataFilePath), outCipher); 
      byte[] roundTrippedBytes = new byte[1000]; //TODO: dynamically resize as we get more data 
      int index = 0; 
      int nextByte; 
      while ((nextByte = cipherInputStream.read()) != -1) { 
       roundTrippedBytes[index] = (byte) nextByte; 
       index++; 
      } 
      recoveredSecret = new String(roundTrippedBytes, 0, index, "UTF-8"); 
      Log.e(TAG, "round tripped string = " + recoveredSecret); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     Log.e(TAG, "recovered: " + recoveredSecret); 
     return recoveredSecret; 
    } 

sorundur - sonuç,

başında hasarlı biraz geliyor

yani: çıkarma >>>>> kX & ALqM, çıkarma

012 A metin için bazı serin metin

cevap

1

i

deneyin kamu statik boolean setKeyStoreString (içinde byte[] bytesToStore = strToStore.getBytes("UTF-8"); sonra byte[] encode = Base64.encode(bytesToStore, Base64.DEFAULT) koymak deşifre) ve "kodlamasının" kontrol etmek aynı i kodlamak için Base64.encode(your byte[], Base64.DEFAULT); kullanılan sorunu ve Base64.decode(your byte[], Base64.DEFAULT) sahip

log
İlgili konular