2017-10-29 7 views
0

AES/CBC를 사용하는 것보다 안전하다는 경고를 받았기 때문에 AES/CBC에서 문자열을 암호화하고 해독하는이 코드를 작성했습니다.내 코드에서 비밀 문자열을 보호하려고하는데 모든 것을 올바르게 했습니까?

private static final String IV = "nVj1Vakka8jaVn9d"; 

private static final String AES_MODE = "AES/CBC/PKCS7Padding"; 
private static final String CHARSET = "UTF-8"; 

public static String encrypt(String message, String password) { 
    try { 
     byte[] messageBytes = message.getBytes(CHARSET); 
     SecretKeySpec key = new SecretKeySpec(password.getBytes(CHARSET), AES_MODE); 
     IvParameterSpec ivSpec = new IvParameterSpec(IV.getBytes(CHARSET)); 

     Cipher cipher = Cipher.getInstance(AES_MODE); 
     cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); 
     byte[] cipherText = cipher.doFinal(messageBytes); 

     return Base64.encodeToString(cipherText, Base64.NO_WRAP); 
    } catch(Exception ex) { 
     return null; 
    } 
} 

public static String decrypt(String base64EncodedCipherText, String password) { 
    try { 
     byte[] encodedBytes = Base64.decode(base64EncodedCipherText, Base64.NO_WRAP); 
     SecretKeySpec key = new SecretKeySpec(password.getBytes(CHARSET), AES_MODE); 
     IvParameterSpec ivSpec = new IvParameterSpec(IV.getBytes(CHARSET)); 

     Cipher cipher = Cipher.getInstance(AES_MODE); 
     cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); 
     byte[] decryptedBytes = cipher.doFinal(encodedBytes); 

     return new String(decryptedBytes, CHARSET); 
    } catch(Exception ex) { 
     return null; 
    } 
} 

내 응용 프로그램에는 디 컴파일러가 볼 수없는 비밀 문자열이 포함되어 있습니다. 이 모든 문자열은이 암호화 메소드가 반환 됨으로써 String 필드에서 암호화됩니다. 이론적으로 IV는 비밀이 아닙니다. 클래스의 문자열 필드로 간단하게 넣을 수 있습니다. 암호는 필요에 따라 Firebase에 의해 안전하게 복구되고 SharedPreferences 또는 코드에 저장되지 않습니다.

나는 모든 것을 올바르게 했습니까?

+3

[codereview.se]에 대한 요청처럼 보입니다. – shmosel

+0

1. IV는 각 암호화에 대해 다른 임의의 값을 필요로하며 일반적으로 암호화 된 데이터의 접두어로 사용됩니다. 2. 암호 해독 키가 메모리에있는 실행 코드에 대한 공격에 실패합니다. 3. 사용 후 메모리의 키를 겹쳐 쓰는 것 또한 필요합니다.이 키는 사용하기가 까다로울 수 있습니다. – zaph

+0

왜 암호화 및 암호 해독 대신 해시가 필요합니까? – user641887

답변

0

해시 및 반복 암호화 해시를 사용할 수 있습니다. 실제 답변은 코드에서 절대 전달되지 않습니다.

개발 중에 PBKDF2, Rfc2898DeriveBytes, Bcrypt 또는 이와 유사한 함수와 같은 함수를 사용하여 결과를 실행하고 결과 + salt를 코드에 추가하십시오. 그것은 뒤집을 수없고 무자비한 공격에 저항력이 없습니다.

코드에서 사용자가 답변을 받아 동일한 소금으로 같은 방법으로 실행하고 결과를 비교합니다.