SoShin_
์†Œ์‹ 
SoShin_
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
    • Study
      • HTML | CSS
      • JavaScript
      • Django
      • Python
      • Flask
      • Git
      • Project
      • ์ด๊ฒƒ์ €๊ฒƒ
      • ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
      • NestJS
    • Review
      • Book
      • Movie & Drama

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • ์žฅ๊ณ 
  • ํ”Œ๋ผ์Šคํฌ
  • ์˜ํ™”์ถ”์ฒœ
  • MongoDB
  • js
  • Django ์œ ํšจ์„ฑ ๊ฒ€์ฆ
  • ์˜ํ™”๋ฆฌ๋ทฐ
  • ์žฅ๊ณ  ์ œ๋„ค๋ฆญ๋ทฐ
  • openpyxl
  • ์žฅ๊ณ  ์œ ์ €๊ธฐ๋Šฅ
  • SQLAlchemy
  • ํŒŒ์ด์ฌ
  • flask orm
  • KakaoAPI
  • Django
  • db
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
  • FLASK
  • allauth
  • SQLite
  • orm
  • node.js
  • JavaScript
  • ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
  • ๋ฌธ์ œํ’€์ด
  • ์œ ์ €๊ธฐ๋Šฅ
  • Django allauth
  • ์œ„๋„๊ฒฝ๋„
  • ์žฅ๊ณ  allauth
  • Python

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
SoShin_

์†Œ์‹ 

Study/JavaScript

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

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

๋ฐ˜์‘ํ˜•

'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
    'Study/JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [ Node.js ] Mongoose ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž!
    • [ Node.js ] readFile, readFileSync ํ•จ์ˆ˜ ์•Œ์•„๋ณด๊ธฐ
    • [ JS ] Event ์ •๋ฆฌ
    • [ JS ] DOM์— ๋Œ€ํ•œ ์ด ์ •๋ฆฌ!
    SoShin_
    SoShin_
    ์ง์ ‘ ์“ฐ๋Š” ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”