๐คทโโ๏ธ crypto๋?
Node.js ์ ๋ด์ฅ๋์ด ์๋ ๋ด์ฅ ๋ชจ๋ ์ค ํ๋๋ก ๋ฌธ์์ด์ ์ํธํ, ๋ณตํธํ, ํด์ฑํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ชจ๋์ ๋๋ค.
Crypto์๋ ์ฌ๋ฌ๊ฐ์ง ์ํธํ ๋ฐฉ์์ด ์์ง๋ง, ์๋์์ Hash๋ฅผ ํตํด ์ํธํ๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค.
โ ์ํธํ ๋ฐฉ์
์ํธํ ๋ฐฉ์์ ํฌ๊ฒ ๋๊ฐ์ง๋ก ๋๋ฉ๋๋ค.
- ๋จ๋ฐฉํฅ ์ํธํ : ๋ณตํธํ๋ฅผ ํ ์ ์๋ ์ํธํ ๋ฐฉ์.
- ์๋ฐฉํฅ ์ํธํ : ๋ณตํธํ๊ฐ ๊ฐ๋ฅํ ์ํธํ ๋ฐฉ์.
๐ ๋ณตํธํ๋?
-> ๋ณตํธํ๋ ์ํธํ ๋ ๊ฒ์ ์ํธํ ๋๊ธฐ ์ ์ ์ํ๋ก ๋๋๋ฆฌ๋ ๊ฒ์ ๋งํฉ๋๋ค.
์ค์ ์น ์๋น์ค์์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฐพ๊ธฐ๋ฅผ ํ ๋, ์๋ ์ฐ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์๋ ค์ฃผ๋ ๊ฒ์ด ์๋ ์๋ก์ด ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑํ๋ ์ฐฝ์ผ๋ก ๋์ด๊ฐ๊ฒ ๋๋๋ฐ์.
์ด๋ ์ฌ์ฉํ๋ ์ํธํ ๋ฐฉ์์ด ๋จ๋ฐฉํฅ ์ํธํ ๋ฐฉ์ ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ์ต๋๋ค.
๐ Crypto ์ฌ์ฉํ๊ธฐ!
const crypto = require('crypto');
module.exports = (password) => {
const hash = crypto.createHash('sha1');
hash.update(password);
return hash.digest("hex");
}
์ ์ฝ๋๋ crypto๋ฅผ ์ฌ์ฉํ์ฌ sh1
์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ hex
ํ์์ผ๋ก ๋ฐํํด์ค๋ค.
ํ์ง๋ง ์ค์ ์๋น์ค๋ฅผ ํ ๋ ์์ฒ๋ผ ์ํธํ๋ฅผ ์งํํ๊ฒ ๋๋ค๋ฉด ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
์์ฒ๋ผ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋ ๊ฒฝ์ฐ ๋น๋ฐ๋ฒํธ๊ฐ ๊ฐ์ ์ ์ ๋ ์ํธํ ๋ ๋น๋ฐ๋ฒํธ๋ ๊ฐ๊ฒ ๋๋ค.
๊ทธ๋ผ ๊ณต๊ฒฉ์๋ ์ด๋ฅผ ํตํด ๋น๋ฐ๋ฒํธ๋ฅผ ์ ์ถํด๋ผ ์ ์๊ธฐ ๋๋ฌธ์ [๋ ์ธ๋ณด์ฐ ํ
์ด๋ธ ]์์ฃผ ์ํํ ๋ฐฉ์์ ์ํธํ ๋ฐฉ๋ฒ์ด๋ค.
๐ ๋ ์ธ๋ณด์ฐ ํ ์ด๋ธ ์ด๋?
-> ๋ ์ธ๋ณด์ฐ ํ ์ด๋ธ์ ํด์ ํจ์(MD5, SHA-1, SHA-2 ๋ฑ)์ ์ฌ์ฉํ์ฌ ๋ง๋ค์ด๋ผ ์ ์๋ ๊ฐ๋ค์ ๋๋์ผ๋ก ์ ์ฅํ ํ์ด๋ค.
์ด๋ฅผ ์ด์ฉํ์ฌ Brute Force attack[๋ฌด์ฐจ๋ณ ๊ณต๊ฒฉ] ๋ฑ์ ์ฌ์ฉํ์ฌ ์ํธ๋ฅผ ์ฐพ์๋ธ๋ค.
๐คทโโ๏ธ Salt๋ฅผ ํตํด ์ํธํ ํ๊ธฐ
Salt
๋ ์ ์ด๋ฏธ์ง ์ฒ๋ผ ํด์ํจ์๋ฅผ ๋๋ฆฌ๊ธฐ ์ ์ ์๋ฌธ์ ์์์ ๋ฌธ์์ด์ ๋ง๋ถ์ด๋ ๊ฒ์ ๋งํ๋ค. ๋จ์ด ๋ป ๊ทธ๋๋ก ์๋ฌธ์ ์์์ ๋ฌธ์์ด์ ๋ถ์ธ๋ค๋ ์๋ฏธ์ ์๊ธ์น๋ค(salting) ๋ ๊ฒ์ด๋ค.
์ ๊ทธ๋ฆผ์ฒ๋ผ ์งํํ๊ฒ ๋ ๊ฒฝ์ฐ ์ฌ์ฉ์๋ง๋ค ๋ค๋ฅธ Salt
๊ฐ์ ๊ฐ์ง๊ณ ์ํธํ ํ๊ธฐ ๋๋ฌธ์ ์์ ํ๋ค.
const crypto = require('crypto')
function hashTest(password) {
const salt = crypto.randomBytes(32).toString('hex')
return crypto.pbkdf2Sync(password, salt, 1, 32, 'sha512').toString('hex')
}
// ์ํธํ
console.log(hashTest('test1234'))
console.log(hashTest('test1234'))
/*
์ถ๋ ฅ
28d736a2fd011804e46355b3bbb0c14cda6ff931446649a60bd9d31611e96b4a
305bd011bd54c60617148cb71a27db2ba0212be463bcc5917ef72261ec62845d
*/
์ ์ฝ๋์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๊ฐ์ ๋น๋ฐ๋ฒํธ์ธ test1234
๊ฐ์ ๋ฃ์ด์คฌ์ง๋ง ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ๋ค๋ฅด๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค!
์ ์ฝ๋๋ฅผ ํ๋ ํ๋ ์ค๋ช ํด๋ณด์๋ฉด, ๋ด์ฅ ๋ชจ๋์ธ crypto๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ถ๋ฌ์์ค ํ,
randomBytes
๋ฅผ ํตํด salt
๋ฅผ ์์ฑํด ์ค๋๋ค. randomBytes
์ ์ธ์๋ก ๋ฌธ์์ด์ size
๋ฅผ ๋ฃ์ด์ฃผ๊ณ , toString
๋ฉ์๋์ ์ธ์ฝ๋ฉ ๋ฐฉ์
์ ์ธ์๋ก ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
์ฆ const salt = crypto.randomBytes(32).toString('hex')
๋ 32์ ๋ฌธ์์ด ๊ธธ์ด๋ฅผ ๊ฐ์ง ๋๋ค ๋ฌธ์์ด์ hex ํ์์ผ๋ก ์ธ์ฝ๋ฉ ํ๋ค๋ ๋ป ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ pbkdf2Sync
๋ฅผ ํตํด ์ํธํ๋ฅผ ์งํํด์ค๋๋ค.pbkdf2Sync
์ ์ธ์๋ก๋ ( ์ํธํ ํ ๋น๋ฐ๋ฒํธ, Salt, ๋ฐ๋ณต ํ์, ๋ฌธ์์ด ๊ธธ์ด, ์ํธํ ์๊ณ ๋ฆฌ์ฆ)
์์๋๋ก ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๊น randomBytes
์ ๊ฐ์ด ๋ง์ง๋ง์ toString
์ ํตํด ์ธ์ฝ๋ฉ ๋ฐฉ์์ ์ ํด์ค๋๋ค.
pbkdf2Sync
๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ์๊น ์ฒ๋ผ ๋ ์ธ๋ณด์ฐ ํ
์ด๋ธ์ด ์์ฑ ๋ ์ ์๊ณ , ๊ฐ ์ ์ ๋ง๋ค ๋ค๋ฅธ salt์ ์ํธํ ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ง๋๊ธฐ ๋๋ฌธ์ ํ ์ฌ๋์ ๋น๋ฐ๋ฒํธ๊ฐ ๋์ถ ๋์๋ค๊ณ ํด์ ๋ค๋ฅธ ์ ์ ๋ค์ด ํผํด๋ฐ๋ ์ํฉ์ ๋ฐฉ์ง ํ ์ ์์ต๋๋ค.
'Study > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ Node.js ] Mongoose ๋ฅผ ์ฌ์ฉํด๋ณด์! (0) | 2022.03.13 |
---|---|
[ Node.js ] readFile, readFileSync ํจ์ ์์๋ณด๊ธฐ (0) | 2022.02.20 |
[ JS ] Event ์ ๋ฆฌ (0) | 2022.02.08 |
[ JS ] DOM์ ๋ํ ์ด ์ ๋ฆฌ! (0) | 2022.02.08 |
[ JS ] JS์ TDZ๋ ๋ฌด์์ผ๊น? (0) | 2022.02.08 |