투케이2K

466. (Android/Java) KeyStore 키스토어 사용해 AES 암호화 인코딩 , 디코딩 수행 실시 본문

Android

466. (Android/Java) KeyStore 키스토어 사용해 AES 암호화 인코딩 , 디코딩 수행 실시

투케이2K 2023. 1. 26. 21:07

[개발 환경 설정]

개발 툴 : 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///===========//: ================================================

 


반응형
Comments