사실 이 문제는 회사에 들어와 가장 먼저 고민했던 문제였다.
로그인 시, 아이디와 패스워드를 암호화해 전송해야 했기 때문이다.
전에 Google Play Console 여기저기를 누르다보니 SHA 방식의 암호화를 지나치듯 본 기억이 있었다.
짧은 AES 방식 소개
하지만 SHA는 복호화할 수 없는 방식이기에 AES 방식을 사용하기로 했다.
AES 암호화 방식은 key 값의 길이에 따라 바뀌는데 16바이트이면 AES-128, 32바이트이면 AES-256이 된다.
대신 IV(Initialization Vector)의 길이는 AES-128, AES-256 둘 모두 16바이트로 동일하다.
Random IV를 적용해보기
여기서 재밌는 기능을 하나 추가해보자.
바로 IV를 매번 random하게 생성하는 것이다.
그리고 key는 IV를 특정한 절차로 가공해서 사용한다고 가정해보자.
나는 IV를 숫자와 영문 대소문자로만 구성되도록 만들어볼 것이다.
마지막 목표는 암호화된 문자열 하나를 뽑아내는 것이다.
public String createRandomIv() {
SecureRandom random = new SecureRandom();
byte[] ivByteArr = new byte[16];
for (int i = 0; i < 16; i++) {
byte vector = (byte) random.nextInt(62);
if (vector < 10) ivByteArr[i] = (byte) (v + 48); // makes number
else if (vector < 36) ivByteArr[i] = (byte) (vector - 10 + 65); // makes uppercase
else if (vector < 62) ivByteArr[i] = (byte) (vector - 36 + 97); // makes lowercase
}
return new String(ivBytes, StandardCharsets.UTF_8);
}
SecureRandom의 등장
여기서 내가 처음 써보는 클래스가 등장한다.
SecureRandom이라는 클래스인데, 대체 java.util.Random과 다른 점이 무엇일까?
신기하게도 Random을 상속받아 만든 녀석이다.
Random은 난수를 생성하는 일종의 키값인 시드(seed)가 시스템 시간 값으로 구성되는데 비해
SecureRandom은 OS에서 임의의 데이터를 가져와 구성한다고 한다.
해당 키값으로 특정 난수 생성 알고리즘에 대입해 값을 생성하기 때문에
Random보다 비교적 안전하다고 할 수 있다.
이제 진짜 암호화하기
직전까지 랜덤한 IV를 만드는데 집중했다면 이제는 정말 IV를 가지고 암호화를 해볼 시간이다.
key는 원래 다른 과정을 거쳐 값을 생성해야 하지만 여기서는 IV와 같은 값으로 사용해보겠다.
public String StringToEncryptAes(String plainText, String iv) {
try {
byte[] textBytes = plainText.getBytes("UTF-8");
byte[] generatedIv = iv.getBytes("ASCII");
AlgorithmParameterSpec ivSpec = new IvParameterSpec(generatedIv);
SecretKeySpec newKey = new SecretKeySpec(generatedIv, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec);
return Base64.encodeToString(cipher.doFinal(textBytes), Base64.DEFAULT);
} catch (Exception e) {
e.printStackTrace();
}
return plainText;
}
암호화되지 않은 문자열은 암호화하기 위해 ByteArray로 변환되어야 한다.
위에서 만든 16바이트의 IV로 key를 만들고 있는 모습을 확인할 수 있다.
만약 다른 AES-192, AES-256 방식을 사용한다면 key의 길이를 바꿔주면 된다.
참조
https://velog.io/@dudwls0505/자바의-난수생성기-Random-SecureRandom
https://docs.oracle.com/javase/8/docs/api/java/security/SecureRandom.html
'Android' 카테고리의 다른 글
Android Talkback Ordinal Number(ScreenReader 서수 읽기) (1) | 2024.07.03 |
---|---|
Android Room 오적용기(misapplied) (0) | 2024.07.02 |
Android Progressbar not spinning(not animated) (0) | 2024.06.26 |
Android White Screen Before Splash Screen Resolved (0) | 2024.06.25 |
Android APK Decompile(Proguard 적용 확인) (0) | 2024.06.12 |