crypto
다양한 방식의 암호화를 도와주는 모듈입니다.
단방향 알고리즘
비밀번호는 보통 단방향 암호화 알고리즘을 사용해서 암호화합니다. 단방향 암호화한 복호화할 수 없는 암호화 방식을 뜻합니다. 복호화는 암호화된 문자열을 원래 문자열로 되돌려 놓는 것을 의미합니다. 즉, 단방향 암호화는 한 번 암호화하면 원래 문자열을 찾을 수 없습니다. 복호화할 수 없으므로 암호화하라고 표현하는 대신 해시 함수라고 부르기도 합니다.
단방향 암호화 알고리즘은 주로 해시 기법을 사용합니다. 해시 기법이란 어떠한 문자열을 고정된 길이의 다른 문자열로 바꿔버리는 방식입니다.
노드에서 해시 함수는 다음과 같이 사용합니다.
hash.js
const crypto = require("crypto");
console.log(
"base64:",
crypto.createHash("sha512").update("바말번호").digest("base64")
);
console.log(
"hex:",
crypto.createHash("sha512").update("비밀번호").digest("hex")
);
console.log(
"base64:",
crypto.createHash("sha512").update("다른 비밀번호").digest("base64")
);
콘솔
$ node hash
base64: 2XPSfV3Mo58ZfSZCDEMSGtTRP9QbyVXbEu7sEi4J2jpeGdJh41HA83z77MzvrPKS/7oh8qoSV8HdkYsNkqK1GQ==
hex: 76f7d5ea7c8b451b773712929531ce92410682a5b61d1b5fbb5f4ebbfa6c517bf095e6db5c26e8c483e60d8385448a6a6afd9e513045b87699ae2e71faeb32d6
base64: cx49cjC8ctKtMzwJGBY853itZeb6qxzXGvuUJkbWTGn5VXAFbAwXGEOxU2Qksoj+aM2GWPhc1O7mmkyohXMsQw==
비밀번호라는 문자열을 해시를 사용해 바꿔봤습니다.
- createHash(알고리즘): 사용할 해시 알고리즘을 넣습니다. md5, sha1, sha256, sha512 등이 가능하지만, md5와 sha1은 이미 취약점이 발견되었습니다. 현재는 sha512로 충분하지만, 나중에 sha512마저도 취약해지면 더 강화된 알고리즘으로 바꿔야 합니다.
- update(문자열): 변환할 문자열을 넣스니다.
- digest(인코딩): 인코딩할 알고리즘을 넣습니다. base64, hex, latin1이 자료 사용되는데, 그중 base64가 결과 문자열이 가장 짧아 애용됩니다. 결과물로 변환된 문자열을 반환합니다.

phkd2는 간단히 말하면 기존 문자열에 salt라고 불리는 문자열을 붙인 후 해시 알고리즘을 반복해서 적용하는 겁니다.
pbkdf2.js
const crypto = require("crypto");
crypto.randomBytes(64, (err, buf) => {
const salt = buf.toString("base64");
console.log("salt:", salt);
crypto.pbkdf2("비밀번호", salt, 100000, 64, "sha512", (err, key) => {
console.log("password:", key.toString("base64"));
});
});
먼저 randomBytes() 메서드로 64바이트 길이의 문자열을 만듭니다. 이것이 salt가 됩니다. pbkdf2() 메서드에는 순서대로 비밀번호, salt, 반복 횟수, 출력 바이트, 해시 알고리즘을 인수로 넣습니다.

콘솔
$ node pbkdf2
salt: CQSrBIsnSuRA+LzTBp4S0SlSyT+UJPyE60tlBQvBhJV68I08umwHtIhj3unmfsRPnXJSsB6eo8uBCwqOdZR+ow==
password: 1x6M+M4iVmgKJ2JS6uzorREzB9kI9BVP9PP2y8+MdUx0Eh+BYDmJAad50oUdc/bntdrXOrUsLdqB3S7VQ+3zvA==
randomBytes이므로 매번 실행할 때마다 결과가 달라집니다. 따라서 salt를 잘 보관하고 있어야 비밀번호도 찾을 수 있습니다.
양방향 암호화
암호화된 문자열을 복호화할 수 있으며, 키라는 것이 사용됩니다. 대칭형 암호화에서 암호를 복호화하려면 사용한 키와 같은 키를 사용해야 합니다.
cipher.js
const crypto = require("crypto");
const algorithm = "aes-256-cbc";
const key = "abcdefghigklmnopqrstuvwxyz123456";
const iv = "1234567890123456";
const cipher = crypto.createCipheriv(algorithm, key, iv);
let result = cipher.update("암호화할 문장", "utf8", "base64");
result += cipher.final("base64");
console.log("암호화", result);
const decipher = crypto.createDecipheriv(algorithm, key, iv);
let result2 = decipher.update(result, "base64", "utf8");
result2 += decipher.final("utf8");
console.log("복호화:", result2);
- crypto.createCipheriv(알고리즘, 키, iv): 암호화 알고리즘과 키, iv를 넣습니다. 암호화 알고리즘은 aes-256-cbc를 사용했으며, 다른 알고리즘을 사용해도 됩니다. aes-256-cbc 알고리즘의 경우 키는 32바이트여야 하고, iv는 16바이트여야 합니다. iv는 암호화할 때 사용하는 초기화 벡터를 의미합니다.
- cipher.update(문자열, 인코딩, 출력 인코딩): 암호화할 대상과 대상의 인코딩, 출력 결과물의 인토딩을 넣습니다. 보통 문자열은 utf8 인코딩을, 암호는 base64를 많이 사용합니다.
- cipher.final(출력 인코딩): 출력 결과물의 인코딩을 넣으면 암호화가 완료됩니다.
- crypto.createDecipheriv(알고리즘, 키, iv): 복호화할 때 사용합니다. 암호화할 때 사용했던 알고리즘과 키, iv를 그대로 넣어야 합니다.
- decipher.update(문자열, 인코딩, 출력 인코딩): 암호화된 문장, 그 문장의 인코딩, 복호화할 인코딩을 넣습니다.
- decipher.final(출력 인코딩): 복호화 결과물의 인코딩을 넣습니다.
콘솔
$ node cipher
암호화 ceahy9MVnDJ1JzS76bBQ5He5a/C0kO5A92IZzr4a8Z4=
복호화: 암호화할 문장
'프로그래밍 언어 > NODE JS' 카테고리의 다른 글
| worker_threads (0) | 2025.04.13 |
|---|---|
| util (0) | 2025.04.10 |
| querystring (0) | 2025.04.04 |
| url (0) | 2025.04.01 |
| path (0) | 2025.03.29 |