본문 바로가기

Programming/Android

Android KeyStore 사용 방법 Sample

작성 목적

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