작성 목적
- Android KeyStore를 처음 사용하면서 추가하는데 자꾸 문제가 발생해서 성공한 내용 저장
간략 설명
- init, Encrypt, Decrypt 메서드로 나누어서 작성
- iv 값은 공개할수 없으므로 Sample에 정리 할때는 0으로 설정
Sample Code
//KeyStore 사용을 위한 변수
private static final String ANDROID_KEY_STORE = "AndroidKeyStore";
private static final String ALIAS = "com.test.keystore";
private static KeyGenerator keyGenerator;
private static KeyGenParameterSpec keyGenParameterSpec;
private static byte[] iv = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
public void keyStoreInit(Context context){
try{
Log.d("TEST", "keyStoreInit start!");
KeyStore keyStore = KeyStore.getInstance(ANDROID_KEY_STORE);
keyStore.load(null);
if(!keyStore.containsAlias(ALIAS)){
keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, ANDROID_KEY_STORE);
keyGenParameterSpec = new KeyGenParameterSpec.Builder(ALIAS, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
.setRandomizedEncryptionRequired(false)
.build();
keyGenerator.init(keyGenParameterSpec);
keyGenerator.generateKey();
}
}catch(Exception e){
e.printStackTrace();
}
}
public static String encryptKeyStore(String autoConnData){
String encryptedData = "";
try{
KeyStore keyStore = KeyStore.getInstance(ANDROID_KEY_STORE);
keyStore.load(null);
IvParameterSpec ivspec = new IvParameterSpec(iv);
KeyStore.SecretKeyEntry secretKeyEntry = (KeyStore.SecretKeyEntry) keyStore.getEntry(ALIAS,null);
SecretKey secretKey = secretKeyEntry.getSecretKey();
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec);
byte[] encryptedByte = cipher.doFinal(autoConnData.getBytes("UTF-8"));
encryptedData = Base64.encodeToString(encryptedByte, Base64.NO_WRAP);
} catch (Exception e){
e.printStackTrace();
}
return encryptedData;
}
public static String decryptKeyStore(String encryptedData){
String decryptedData="";
try {
KeyStore keyStore = KeyStore.getInstance(ANDROID_KEY_STORE);
keyStore.load(null);
IvParameterSpec ivspec = new IvParameterSpec(iv);
KeyStore.SecretKeyEntry secretKeyEntry = (KeyStore.SecretKeyEntry) keyStore.getEntry(ALIAS,null);
SecretKey secretKey = secretKeyEntry.getSecretKey();
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivspec);
byte[] decryptedByte = Base64.decode(encryptedData.getBytes("UTF-8"), Base64.NO_WRAP);
decryptedData = new String(cipher.doFinal(decryptedByte));
} catch (Exception e){
e.printStackTrace();
}
return decryptedData;
}
'Programming > Android' 카테고리의 다른 글
[Android] asset 내부 파일 내부저장소에 저장 (0) | 2023.02.18 |
---|---|
[React-Native] react-native-webview 에러 해결 (0) | 2022.09.22 |
Google Play 정책 위반 관련 참고사항 (0) | 2022.09.20 |
AAB(Android App Bundle) 생성 방법 (0) | 2022.05.10 |
JAVA 설치 및 환경변수 설정 (0) | 2020.02.11 |