암호화는 너무나도 당연한 개념인 것 같지만, 그 구현 방법은 간단하지만은 않습니다. 아무튼, 만약 DB상에 비밀번호가 암호화되지 않은 상태로 저장된다면 DB가 해킹당하는 순간 모든 계정 정보가 탈취당하겠죠? DB가 해킹당하지 않도록 방어하는 것이 최우선이겠지만, 만일을 위해 암호화를 진행해야 합니다.
암호화 방법 중 우선 '단방향 암호화'에 대해서 먼저 살펴보겠습니다.
○ 단방향 암호화
단방향 암호화는 "복호화(암호화된 문자열을 원래대로 복구시키는 것)가 불가능한 암호화 방식"입니다. 그리고 이 복호화 할 수 없는 방식이기 때문에 암호화가 아닌 '해시 함수'라고 부르기도 합니다. 이에 대한 설명은 아래에서 추가로 진행하겠습니다.
이 단방향 암호화 개념만 들어보면, 원래대로 복구가 꼭 필요한 것이 아닐까 생각이 들 수 있습니다. 하지만, 이 단방향 암호화 동작 방식을 살펴보면 꼭 그럴 필요도 없다는 것을 알게 되지요.
1. 우선 유저의 비밀번호를 일정 알고리즘으로 암호화해서 DB에 저장합니다.
2. 로그인 할 때마다 입력받은 비밀번호를, 동일한 알고리즘으로 변환한 후 DB의 비밀번호와 비교합니다.
3. 변환한 비밀번호와 DB의 변환된 비밀번호가 같으면 로그인에 성공합니다.
4. 결과적으로 '원래의 비밀번호'는 어디에도 저장되어 있지 않습니다.
위에서 이 단방향 암호화 알고리즘에서 '해시 함수'라는 용어가 언급되었습니다. 단방향 암호화 알고리즘은 주로 이 해시 기법을 사용합니다. 여기서 말하는 해시 기법은, 어떤 문자열을 고정된 길이의 다른 문자열로 바꾸어버리는 방법입니다.
예를 들어 볼까요? 'abcdefgh'라는 문자열을 입력하면 "qvet"로 바꾸어버립니다. 여덟 글자가 네 글자로 바뀌었네요? 그리고 'ijklm'이라는 문자열은 "zmda"로 바꿉니다. 다섯 글자인데 이번에도 네 글자로 바뀌었죠. 입력된 길이는 각각이지만, 출력되는 문자열 길이는 네 글자로 고정되었습니다. 이러면 바뀐 문자열이 유출되어도, 원래의 비밀번호를 유추하기 어렵겠죠?
그럼 실제로 crypto 모듈을 통해 해시 기법을 통한 단방향 암호화 예제를 살펴보겠습니다. 우선 crypto 모듈을 이용한 노드에서의 해시 함수는 아래와 같습니다.
· createHash('알고리즘명') : 사용할 해시 알고리즘을 선언합니다. 여기에는 스트링으로 'md5', 'sha1', 'sha256', 'sha512' 등을 넣어주면 됩니다. 참고로 'md5', 'sha1' 등의 경우 취약점이 발견되었으므로 최근에는 'sha512'정도를 사용해야 합니다.
· update(문자열) : 암호화 할 문자열을 넣어줍니다.
· digest('인코딩알고리즘명') : 인코딩할 알고리즘을 넣는데, 'base64', 'hex', 'latin1'이 주로 사용됩니다. 참고로 base64가 결과 문자열이 가장 짧아서 많이 사용됩니다. 결과물로 변환된 문자열을 리턴하게 됩니다.
const crypto = require('crypto');
console.log('base64 : ', crypto.createHash('sha512').update('password').digest('base64'));
console.log('hex : ', crypto.createHash('sha512').update('password').digest('hex'));
console.log('base64 : ', crypto.createHash('sha512').update('other-password').digest('base64'));
/* 출력
base64 : sQnzu7wkTrgkQZF+0G1hi5AI3Qmzvv0bXgc5THBqi7mAsdd4Xll27ASbRt9fEyavWi6m0QP9B8lThf+rDKy8hg==
hex : b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86
base64 : VObtH7mbEpc0y+QlXH62L5LUTTSWeja4AyrqOKvHuBL9K0pAIPDxRzfab5mZ0+0TmnX9xt7qnnQy7Ay59Mw1Ig==
*/
'Programming > Node.js' 카테고리의 다른 글
4. Node 기능 살펴보기 (4) - 노드 내장 모듈 7 [crypto] : 양방향 암호화 (0) | 2024.04.25 |
---|---|
4. Node 기능 살펴보기 (4) - 노드 내장 모듈 7 [crypto] : 단방향 암호화 2 (0) | 2024.04.23 |
4. Node 기능 살펴보기 (4) - 노드 내장 모듈 6 [dns] (1) | 2024.04.19 |
4. Node 기능 살펴보기 (4) - 노드 내장 모듈 5 [url 2/2] (0) | 2024.04.18 |
4. Node 기능 살펴보기 (4) - 노드 내장 모듈 5 [url 1/2] (0) | 2024.04.17 |