Notice
Recent Posts
Recent Comments
Link
투케이2K
466. (Android/Java) KeyStore 키스토어 사용해 AES 암호화 인코딩 , 디코딩 수행 실시 본문
[개발 환경 설정]
개발 툴 : AndroidStudio
[소스 코드]
// -------------------------------------
// [로직 처리 실시]
// -------------------------------------
try {
/**
* ----------------------------------
* [요약 설명]
* ----------------------------------
* 1. KeyStore 시스템은 승인되지 않은 접근에 대해 중요한 데이터를 보호하기 위한 암호화 저장 공간입니다
*
* - KeyStore 는 디바이스에서의 승인되지 않은 접근에 대해 이들 제한을 강제함으로써 승인되지 않은 접근에 대한 위협을 줄여줍니다
* ----------------------------------
* 2. KeyStore 시스템은 Android 4.0(API 수준 14)에서 도입된 KeyChain API 에서 사용됩니다
* ----------------------------------
* 3. KeyStore 는 Encryption / Decryption (암 / 복호화) 및 Digital Signature (전자서명) 에 사용되는 Private Key (개인키), Public Key (공개키) 와 Certificate (인증서) 를 제공 합니다
* ----------------------------------
* 4. KeyStore 에 데이터 암호화 및 복호화를 수행 할 때 AES, RSA 등 알고리즘을 선택해서 사용할 수 있으며, AES 는 마시멜로 이상 버전에서 사용할 수 있습니다
* ----------------------------------
* 5. 참고 사이트 :
*
* https://developer.android.com/training/articles/keystore?hl=ko
*
* https://www.tabnine.com/code/java/classes/android.security.keystore.KeyGenParameterSpec$Builder
*
* https://developer.android.com/reference/android/security/keystore/KeyGenParameterSpec
*
* https://www.tabnine.com/code/java/classes/javax.crypto.KeyGenerator
*
* https://www.tabnine.com/code/java/methods/android.security.keystore.KeyGenParameterSpec$Builder/setKeySize
* ----------------------------------
* */
// [KeyGenerator 생성에 필요한 정보 정의]
String KEY_NAME = "PrivateKeyTwok";
String AndroidKeyStore = "AndroidKeyStore";
// [AES 방식을 사용하기 위해 마시멜로우 버전 체크]
if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
// [비대칭 암호화 새 개인 키 생성 및 KeyStore 에 저장 실시]
KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, AndroidKeyStore); // [알고리즘 지정]
keyGenerator.init(new KeyGenParameterSpec.Builder(
KEY_NAME,
KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) // [인코딩 , 디코딩 설정]
.setBlockModes(KeyProperties.BLOCK_MODE_CBC) // [CBC 모드]
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) // [패딩 설정]
.build());
keyGenerator.generateKey();
// [Keystore 로드]
KeyStore keyStore = KeyStore.getInstance(AndroidKeyStore);
keyStore.load(null);
// [aes 비밀키 가져온다]
SecretKey secretKey = (SecretKey) keyStore.getKey(KEY_NAME, null);
// [데이터 암호화 및 복호화 수행에 필요한 형식 지정]
String transformat = KeyProperties.KEY_ALGORITHM_AES + "/"
+ KeyProperties.BLOCK_MODE_CBC + "/"
+ KeyProperties.ENCRYPTION_PADDING_PKCS7;
// [데이터 암호화 수행]
Cipher endcode_Cipher = Cipher.getInstance(transformat);
endcode_Cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte encode[] = endcode_Cipher.doFinal("hello".getBytes());
String encodeData = Base64.encodeToString(encode, 0);
// [데이터 복호화 수행]
Cipher decode_Cipher = Cipher.getInstance(transformat);
decode_Cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(endcode_Cipher.getIV()));
byte decode[] = Base64.decode(encodeData, Base64.DEFAULT);
String decodeData = new String(decode_Cipher.doFinal(decode), "UTF-8");
// [로그 출력 실시]
S_Log.ltd("================================================");
S_Log.cnt("["+ACTIVITY_NAME+" >> "+C_Util.getNowMethod(1)+" :: 로그 출력 실시]");
S_Log.cnt("[keyStore isKeyEntry :: "+String.valueOf(keyStore.isKeyEntry(KEY_NAME))+"]");
S_Log.cnt("[keyStore getType :: "+String.valueOf(keyStore.getType())+"]");
S_Log.cnt("[secretKey getAlgorithm :: "+String.valueOf(secretKey.getAlgorithm())+"]");
S_Log.cnt("[encodeData :: "+String.valueOf(encodeData)+"]");
S_Log.cnt("[decodeData :: "+String.valueOf(decodeData)+"]");
S_Log.lbd("================================================");
}
}
catch (Exception e){
e.printStackTrace();
}
[결과 출력]
D///===========//: ================================================
I/: [A_Intro >> onCreate :: 로그 출력 실시]
I/: [keyStore isKeyEntry :: true]
I/: [keyStore getType :: AndroidKeyStore]
I/: [secretKey getAlgorithm :: AES]
I/: [encodeData :: JiN8+THAuHjU1pQqWcLxrg==
]
I/: [decodeData :: hello]
D///===========//: ================================================
반응형
'Android' 카테고리의 다른 글
Comments