2016-03-31 15 views
1

私はアプリ内で秘密(String)をどこにでも持っているようにしようとしています。だから私はキーストアを使って鍵を保管し、それを私の秘密の暗号化と解読に使用するというこのアイデアを思いついた。ここで私は(暗号化)を保存する方法私の秘密です:暗号化/復号化のためにSecretKeyを格納するためのAndroid KeyStore

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

、ここでは、私はそれを取得しようとする方法である:

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

問題がある - 結果は

、初めに損傷を受けた少し来ます

すなわち:抽出>>>>> KX & ALqM、 抽出

012用のテキストのためのいくつかのクールなテキスト

答えて

1

私は

をログのpublic static boolean型setKeyStoreStringに byte[] bytesToStore = strToStore.getBytes("UTF-8");byte[] encode = Base64.encode(bytesToStore, Base64.DEFAULT) を置く

試しを()をデコードし、「エンコード」にチェックするためにエンコードするためにBase64.encode(your byte[], Base64.DEFAULT);を使用してBase64.decode(your byte[], Base64.DEFAULT)同じ問題を抱えています

関連する問題