회사에서 소스 분석 발표를 진행하게 되었는데,
PPT를 준비하다 보니 암호화에 대해 관심이 생겨 포스팅하려 한다
위 테이블에 나와 있는 것처럼
암호화는 크게 Aes, Sha, Rsa 3가지 방식으로 나뉜다
Aes와 Rsa는 양방향 암호화 방식으로
Data를 암호화시킬 수 있고, 반대로 복호화도 가능한 알고리즘이다
Sha 암호화 방식은 단 방향 암호화 방식이기 때문에 복호화는 불가능하고
단순 로그인 시 비밀번호가 맞는지만 true/false로 체크해주는 방식이다
단 방향 암호화는 복호화가 안되기 때문에 개인정보나 중요한 정보들을 제삼자가 복호화시켜 볼 수 없게 할 수 있다
분석한 소스에서는 Aes 알고리즘을 사용하였다
사용자들이 캠페인을 신청하고 후에 자신이 입력했던 정보들을 다시 보고 싶을 때 확인하는 조회 기능,
그것들을 수정할 수 있는 수정 기능 등
개인정보들이 암호화돼서 DB에 들어가 있는 상황이기 때문에
사용자 본인이 입력한 값들을 다시 가져와서 보여주려면 복호화 과정이 이루어져야 하기 때문에
양방향 알고리즘이 적용된 것 같았다
소스들을 올릴 순 없지만 문서들을 보면서 몰랐던 용어들의 정리가 필요할 것 같아 포스팅한다
SecretKeySpec skc = new SecretKeySpec(thedigest, "AES");
1) Secret Key
Secret Key는 평문을 암호화하는 데 사용되며 절대로 외부에 노출되어서는 안 됩니다.
AES의 종류가 무엇이냐에 따라 Secret Key의 길이가 달라집니다.
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
2) Block Cipher
AES는 128비트(16바이트)의 고정된 블록 단위로 암호화를 수행합니다. (이는 암호화 키의 길이와 전혀 무관합니다)
암호화를 수행할 때 여러 가지 Block Cipher Mode를 선택할 수 있으며 크게 CBC, ECB 등이 있습니다.
권장하는 방식은 CBC 방식입니다.
AES는 128비트의 블록단위로 암호화를 수행하는데 128비트보다 작은 블록이 생길 경우 부족한 부분을 특정 값으로 채워야 합니다.
이러한 작업을 패딩이라고 부르며, 대표적으로 PKCS5, PCKS7 방식이 있습니다.
AES는 128비트의 고정된 블록 단위로 암호화를 수행하는데, CBC는 블록을 그대로 암호화하지 않고 이전에 암호화했던 블록과 XOR 연산을 한 다음에 암호화를 수행합니다.
그래서 같은 내용을 갖는 원문 블록이라도 전혀 다른 암호문을 갖게 됩니다. 그런데 첫 번째 블록은 이전 암호화 블록이 없기 때문에 이를 위해 IV(initialization vector)를 이용합니다.
AES는 128비트(16바이트) 단위로 암호화하기 때문에 IV 또한 16바이트 크기여야 합니다. IV가 생성되면 이 값을 가지고 첫 번째 블록을 암호화합니다. 매번 다른 IV를 생성하면 같은 평문이라도 다른 암호문을 생성할 수 있습니다.
자세한 내용은 아래 링크 참조
https://bamdule.tistory.com/234
[JAVA] AES-256 암호화 하기
1. AES 란? AES는 고급 암호화 표준이라는 의미이며, 암호화 및 복호화 시 동일한 키를 사용하는 대칭키 알고리즘입니다. AES의 종류는 AES-128, AES-192, AES-256이 있고 각각 뒤에 붙은 숫자가 키의 길이
bamdule.tistory.com
[ Padding ]
패딩이란 데이터를 블록으로 암호화할 때 평문이 항상 블록 크기의 배수가 되지 않는다
패딩은 평문의 마지막 블록이 암호화되기 전에 어떤 데이터로 채워줄 것인지를 확실히 지정하여 채워주는 방식
데이터를 특정 크기로 맞추기 위해 특정 크기보다 부족한 부분을 채워 넣는 작업이다
그리고 암호화 시 패딩을 수행한 경우엔 복호화 과정에서는 패딩을 제거해야 할 한다
[ PKCS 패딩 ]
PKCSS패딩과 PKCS7 패딩으로 구분이 되어 있다
PKCS7 패딩은 최대 16byte까지의 블록 사이즈에 대해서도 동작하도록 정의한 것만 빼고는 동작 방식이 동일하다
PKCS 패딩 방법은 채워준 바이트의 크기로 각각의 자리를 채워주는 방식이다
예시로 블록 사이즈가 16일 때,
블록 사이즈를 8바이트로 설정해놓은 상태에서 평문으로 5바이트의 평문이 입력되면
[ AA A1 A2 A3 A4 _ _ _ ] 이런 식으로 블록이 채워지고
블록 사이즈인 8바이트 중에 3바이트가 모자란 상태에서 패딩을 수행하면
[ AA A1 A2 A3 A4 03 03 03 ] 이런 식으로 블록을 채워주는 방식이 PKCS 방식이다
그 외에
모자란 부분을 0으로 채워주는 Zero 패딩
임의의 데이터로 채워주는 ISO10126 패딩 등이 있다
'TIL > Algorithm' 카테고리의 다른 글
Java 백준 2751번 문제 - 수 정렬하기2 (0) | 2021.11.24 |
---|---|
Java 백준 2750번 문제 - 수 정렬하기 (0) | 2021.11.23 |
Java 백준 7568번 문제 - 덩치 (0) | 2021.11.18 |
Java 백준 2231번 문제 - 분해합 (0) | 2021.11.16 |
Java 백준 10870번 문제 - 피보나치 수열 (0) | 2021.10.30 |