์ฐธ๊ณ ์ฌ์ดํธ
์ฐ๋ฆฌ๋ ๋ณธ์ธ์ ์ธ์ฆํ ๋, ์ค์ํ ์ ๋ณด๋ค์ ๋ด์๋ณด๋ธ๋ค.
์์ด๋, ๋น๋ฐ๋ฒํธ, ๊ฐ์ธ์ ๋ณด(์ด๋ฆ, ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ, ํธ๋ํฐ ๋ฒํธ) ๋ฑ...
๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋ ์ ์ถ์ด ๋๋๋ผ๋ ํด๋น ๋ฐ์ดํฐ๋ฅผ ๋น๋ฐ์ค๋ฝ๊ฒ ๋ฐ๊พธ์ด ํด์ปค๊ฐ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ํ์ ํ์ง ๋ชปํ๋๋กํด์ผ ์กฐ๊ธ์ด๋๋ง ๋ ์์ ํ ์ ์๊ธฐ์ ์ํธํ๊ฐ ํ์ํ๋ค.
๐ ์ํธํ
์ํธํ๋, ํน์ ์ง์์ ์์ ํ๊ณ ์๋ ์ฌ๋๋ค์ ์ ์ธํ๊ณ ๋ ๋๊ตฌ๋ ์ง ์ฝ์ด๋ณผ ์ ์๋๋ก ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ ๊ณผ์ ์ด๋ค.
๋ฐ๋๋ก ์ํธ๋ฌธ์ ํ๋ฌธ์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ์ ๋ณตํธํ๋ผ๊ณ ํ๋ค.
โ ๏ธ ์ํธํ์ ํ์์ฑ
์ ์ ์ ๋น๋ฐ๋ฒํธ๋ ๊ทธ๋๋ก DATABASE์ ์ ์ฅํ์ง ์๋๋ค.
โ DB๊ฐ ํดํน ๋นํ๋ฉด ์ ์ ์ ๋น๋ฐ๋ฒํธ๊ฐ ๊ทธ๋๋ก ๋ ธ์ถ๋๋ค.
โ ์ธ๋ถ ํดํน์ด ์๋๋๋ผ๋ ๋ด๋ถ ๊ฐ๋ฐ์๊ฐ DB์ ์ ๊ทผํด ๊ฐ์ธ์ ๋ณด๋ฅผ ๋ณผ ์ ์๋ค.
๐ bcrypt
๋จ๋ฐฉํฅ ์ํธํ๋ฅผ ์ํด ๋ง๋ค์ด์ง ํด์ ํจ์์ด๋ค. ์ฆ, ๋ณตํธํ๋ ๋ถ๊ฐ๋ฅํ๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ณตํธํ๊ฐ ๋ถ๊ฐ๋ฅํ๋ฐ, ์ด๋ป๊ฒ ๊ธฐ์กด์ ๋น๋ฐ๋ฒํธ์ ๋น๊ตํ์ฌ ์ณ์์ง ํ๋จํ ์ ์์๊น?
๐ข ๋น๋ฐ๋ฒํธ ์์ฒด๋ฅผ ๊ฒ์ฆํ ๋๋ ์ ๋ ฅ๋ฐ์ ๊ฐ์ ์ํธํํด์ ์ ์ฅ๋ ์ํธํ๋ ๊ฐ๊ณผ ๋น๊ตํด์ ๊ฒ์ฆํ ์ ์๋ค.
๐๏ธ Hash
์์์ ๊ธธ์ด๋ฅผ ๊ฐ๋ ์์์ ๋ฐ์ดํฐ์ ๋ํด ๊ณ ์ ๋ ๊ธธ์ด์ ๋ฐ์ดํฐ๋ก ๋งตํํ๋ ํจ์๋ฅผ Hashํจ์๋ผ๊ณ ํ๋ค.
์ด ํจ์์ ๊ฒฐ๊ณผ๋ฌผ์ด Hash๊ฐ์ด๋ค.
๐ก ๊ธฐ์กด sha256๊ณผ ๊ฐ์ ํด์ ํจ์๋ค์ด ์ฌ์ฉ๋๊ณ ์์์ผ๋, sha256๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ์ํธํ๋ฅผ ์ํด ์ค๊ณ๋ ๊ฒ์ด ์๋ ์งง์ ์๊ฐ๋ด์ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ๊ฒ์ํ๊ธฐ ์ํ ๊ตฌ์กฐ๋ก ์ค๊ณ ๋์ด์๋ค. ๋ฐ๋ผ์ ๋น ๋ฅธ ์๋๊ฐ ์ฅ์ ์ด์ง๋ง, ๋ณด์์ ์ทจ์ฝํ๋ค๋ ๋จ์ ์ด ์๋ค.
๋ํ ๋ฏธ๋ฆฌ ํด์๊ฐ์ ๊ณ์ฐํด๋์ Rainbow Table, Rainbow Table Attack์ด๋ผ๋ ํด์ ํจ์ ๋ฐํ ๊ฐ์ ์ญ์ถ์ ํ๋ ํดํน ๋ฐฉ๋ฒ์ผ๋ก ์ธํ ๋ณด์ ์ทจ์ฝ์ ๋ค์ด ์กด์ฌํ๋ค.
๐ง Salting
์ค์ ๋น๋ฐ๋ฒํธ ์ด์ธ์ ์ถ๊ฐ์ ์ธ ๋๋คํ ๋ฐ์ดํฐ ๊ฐ์ ๋ํด ํด์๊ฐ์ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์์์ ๊ฐ์ ์น๋ฏ, ์ ์ ๊ฐ ์ด๋ ํ ๋น๋ฐ๋ฒํธ๋ฅผ ์ค์ ํ๋ ์ง ์๊ด์์ด ๊ฑฐ๊ธฐ์ ๋์๋ฅผ ์ถ๊ฐํ์ฌ ํด์ํจ์์ ์ง์ด๋ฃ๋ ๊ฒ์ด๋ค.
์ฆ ๋น๋ฐ๋ฒํธ์ ๋ณต์ก๋๋ฅผ ํค์ ๋ณด์์ ๋์ด๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ๋๋ฉด ๋น๋ฐ๋ฒํธ์ ๊ธธ์ด๊ฐ ๋งค์ฐ ๊ธธ์ด์ง๊ณ , ๋น๋ฐ๋ฒํธ๊ฐ ๊ธธ์๋ก ํฌ๋ํนํ๋๋ฐ ํ์ํ ์ฐ์ฐ์๊ฐ์ด ๋ ๋์ด๋ ํดํน์ด ์ด๋ ค์์ง๋ค.
โ๏ธ Key Stretching
๋จ๋ฐฉํฅ ํด์ ๊ฐ์ ๊ณ์ฐํ ๋ค, ๊ทธ ํด์ ๊ฐ์ ํด์ํ๊ณ , ๋ ํด์ํ๋ ๋ฐ๋ณต ๊ณผ์ ์ ๋งํ๋ค. ํค ์คํธ๋ ์นญ์ ์ ์ฉํ์ฌ ๋์ผ ์ฅ๋น์์ 1์ด์ 5๋ฒ ์ ๋๋ง ๋น๊ตํ ์ ์๋๋ก ํ๋ค.
์ฆ, ๊ธฐ์กด ๋จ๋ฐฉํฅ ํด์ ์๊ณ ๋ฆฌ์ฆ์ ๋น ๋ฅธ ์คํ์๋๊ฐ ์ทจ์ฝ์ ์ด ๋๋ ๊ฒ์ ๋ณด์ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด๋ค.
๐ง๐ป๐ป Code
โฌ๏ธ intall
bcrypt ๋ฅผ ์ค์นํ๋ค.
$ npm install bcrypt
๐ import
์ค์นํ bcrypt๋ฅผ ๊ฐ์ ธ์จ๋ค.
const bcrypt = require('bcrypt');
๐ encrypt
๊ฐ์ ธ์จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ํจ์๋ฅผ ์์ฑํ๋ค.
// ์์์ ๋น๋ฐ๋ฒํธ ์ค์ .
const password = '1111';
// ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅ ๋ฐ์ ํด๋น ๊ฐ์ ์ํธํ
const encryption = (target) => {
// ์ฐ์ ์ํ
ํ ๊ฐ์ ์์ฑ
const salt = bcrypt.genSaltSync(10);
// ์ํธํํ๊ณ ์ ํ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ํด์ฌํ๊ณ ์ํธ๊ฐ์ ๋ํจ
const hash = bcrypt.hashSync(target, salt);
//๊ฒฐ๊ณผ ์ถ๋ ฅ
console.log(salt);
console.log(hash);
};
//ํจ์ ์คํ
encryption(password);
๋ค์๊ณผ ๊ฐ์ด ์์ฑ ํ, ํด๋น ํ์ผ์ ์คํํ๋ค.
# ์ฒซ ๋ฒ์งธ ์คํ
$ node src/hash/index.js
$2b$10$OTjAIB8Oq.p7TNM8ViNaK.
$2b$10$OTjAIB8Oq.p7TNM8ViNaK.fvN7eYh8YaV4gqeD3WlMZgmjgohfPDa
# ๋ ๋ฒ์งธ ์คํ
$ node src/hash/index.js
$2b$10$oMMPhA3og8VskrgrwZIBlu
$2b$10$oMMPhA3og8VskrgrwZIBlugJDSwVVgNtarZnMBhGFhKedY7zmFJoq
๋๊ฐ์ ๊ฐ password = '1111'์ ํด์ฌํ๋๋ฐ ๊ฒฐ๊ณผ๋ ์ ํ ๋ค๋ฅธ ๊ฐ์ด ๋์ค์ง๋ง ์ด๋ฅผ ๊ฒ์ฆํ์ฌ ๋น๋ฐ๋ฒํธ๋ฅผ ํ์ธํ ์ ์๋ค.
$2๋ bcrypt์ ๋ฒ์ ์ ์๋ฏธํ๋ฉฐ,
$10์ salt ๊ฐ์ ์์ฑํ ๋, ์ ๋ ฅํด์ค ๊ฐ์ ์๋ฏธํ๋ค.
salting์ ํ ๋ ์ ๋ ฅํ setRounds๊ฐ์ ๋ค์๊ณผ ๊ฐ์ ์๊ฐ์ ๊ฐ์ง๋ค.
๐ง๐ป๐ค๐ง๐ป compare
์์ ์ํธํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์กด ๋ฐ์ดํฐ์ ๋น๊ตํ์ฌ ๋ก๊ทธ์ธํด๋ณด์.
const correctPw = '1111';
const inCorrectPw = '1112';
const hash = '$2b$10$OTjAIB8Oq.p7TNM8ViNaK.fvN7eYh8YaV4gqeD3WlMZgmjgohfPDa';
const comparePw = (target, hash) => {
bcrypt.compare(target, hash).then((res) => {
if (res) console.log('Success LogIn');
else console.log(target, 'is not correct');
return res;
});
};
comparePw(correctPw, hash);
comparePw(inCorrectPw, hash);
๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๊ณ ์ฝ๋๋ฅผ ์คํํ๋ค.
$ node src/auth/hash/index.js
Success LogIn
1112 is not correct
'1111'์ ๋ฃ์ ํจ์๋ "Success Login"์ ์ถ๋ ฅํ๊ณ
'1112'๋ฅผ ๋ฃ์ ํจ์๋ ์ณ์ง ์์ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ค.