Study/JavaScript

[ Node.js ] crypto๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” ํ•˜๊ธฐ

SoShin_ 2022. 2. 24. 19:28
๋ฐ˜์‘ํ˜•

๐Ÿคทโ€โ™‚๏ธ 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์™€ ์•”ํ˜ธํ™” ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ง€๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ์‚ฌ๋žŒ์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋ˆ„์ถœ ๋˜์—ˆ๋‹ค๊ณ  ํ•ด์„œ ๋‹ค๋ฅธ ์œ ์ €๋“ค์ด ํ”ผํ•ด๋ฐ›๋Š” ์ƒํ™ฉ์„ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•