내가 했던 프로젝트를 되돌아보면서, Node로 구현한 첫 프로젝트에서 암호화에 대해서 질문한 것이 생각나서 다시 한번 정리해보기로 했다.
유저가 회원가입시 비밀번호를 Bcrypt로 암호화해서 DB에 저장하는 작업이나 익명으로 글 작성시 비밀번호를 받은 것도 암호화해서 저장했기 때문에 좀 더 정확히 알아야 할 필요성을 느꼈다.
단방향 암호화 (= 일방향 암호화)
암호화된 데이터에 대한 복호화가 불가능한 암호화 방식이다.
대표적으로는 Hash와 MAC가 있다.
Hash
임의의 길이 메시지로부터 고정길이의 해시값을 계산한다.
단방향 암호화이기 때문에 해시값으로부터 메시지를 역산할 수는 없으며 이를 일방향성을 갖는다라고 말한다.
메시지가 다르면 해시값도 달라지는 특성으로 인해 해시함수를 무결성 확인의 용도로 사용하기도 한다.
만약 , 각각 다른 메시지가 같은 해시값을 갖게 된다면 이것을 충돌이라고 한다.
해시함수의 대표적인 알고리즘으로는 MD5 와 SHA-256/512 등이 있다.
특징
- 어떤 입력 값에도 항상 고정된 길이의 해시 값을 출력한다.
- 입력 값의 아주 일부만 변경되어도 전혀 다른 결과 값을 출력한다. (눈사태 효과)
- 출력된 결과 값을 토대로 입력 값을 유추할 수 없다.
- 입력 값은 항상 동일한 해시 값을 출력한다.
MAC (Message Authentication Code = 메시지 인증 코드)
임의 길이의 메시지와 송수신자가 공유하는 키를 기반으로 하는 고정 길이의 출력값을 계산하는 함수로 출력한 값을 MAC라고 한다.
MAC 알고리즘은 메시지와 키를 이용해서 MAC 값을 구하고 송신자는 메시지에 MAC 값을 끼워 보낸다.
수신자는 받은메시지와 본인의 키로 MAC 알고리즘을 통해 MAC 값을 구하고 송신자가 보낸 MAC 값과 일치하는지 확인한다.
이를 통해서 메시지의 데이터 인증과 더불어 무결성을 보호한다.
양방향 암호화
암호화된 데이터에 대한 복호화가 가능한 암호화 방식
대표적으로 대칭키, 공개키 암호화 방식이 있다.
대칭키
대칭키는 암복호화키가 동일하며 해당 키를 아는 사람만이 문서를 복호화해 볼 수 있게 한다.
암호화와 복호화에 동일한 키를 사용하므로 키 관리가 매우 중요하다
대표적인 알고리즘으로 DES, 3DES, AES, SEED, ARIA 등이 있다.
- 공개키 암호화 방식에 비해 속도가 빠르다.
공개키
키가 공개되어있기 때문에 키를 교환할 필요가 없어지며 공개키는 모든 사람이 접근 가능한 키이고 개인키는 각 사용자만이 가지고 있는 키이다.
순서는 공개키/개인키 쌍을 생성하고 공개키는 공개, 개인키는 본인이 소유한다. 송신자가 수신자의 공개키를 받아와서 데이터 암호화에 사용하고 암호화된 데이터를 수신자에게 전송 하고 수신자는 암호화된 데이터를 수신자의 개인키로 복호화한다. (이로써 수신자만 볼 수 있다.)
장점
- 공개키는 공개되어 있기 때문에 키교환이나 분배를 할 필요가 없어진다.
- 개인키를 가지고 있는 수신자만이 암호화된 데이터를 복호화할 수 있으므로 일종의 인증기능도 제공한다.
단점
- 대칭키 암호화 방식에 비해 속도가 느리다.
참고
https://velog.io/@castleq90/bcrypt%EB%B9%84%ED%81%AC%EB%A6%BD%ED%8A%B8
https://velog.io/@yenicall/%EC%95%94%ED%98%B8%ED%99%94%EC%9D%98-%EC%A2%85%EB%A5%98%EC%99%80-Bcrypt