[TIL] Crypto hash

Dev_minΒ·2019λ…„ 10μ›” 19일
0

TIL

λͺ©λ‘ 보기
23/61

πŸ‘‰ Crypto hash λž€ ?

​ : ν•΄μ‹œ(hash)λž€ 단방ν–₯ μ•”ν˜Έν™” κΈ°λ²•μœΌλ‘œ ν•΄μ‹œν•¨μˆ˜(ν•΄μ‹œ μ•Œκ³ λ¦¬μ¦˜)λ₯Ό μ΄μš©ν•˜μ—¬ κ³ μ •λœ 길이의 μ•”ν˜Έν™”λœ λ¬Έμžμ—΄λ‘œ λ°”κΏ”λ²„λ¦¬λŠ” 것을 의미

ν•΄μ‹œν•¨μˆ˜(hash function)λŠ” μž„μ˜μ˜ 길이의 데이터λ₯Ό κ³ μ •λœ 길이의 λ°μ΄ν„°λ‘œ λ§€ν•‘ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. μ΄λ•Œ, 맀핑 μ „ μ›λž˜ λ°μ΄ν„°μ˜ 값을 ν‚€(key), 맀핑 ν›„ λ°μ΄ν„°μ˜ 값을 ν•΄μ‹œκ°’(hash value), λ§€ν•‘ν•˜λŠ” 과정을 ν•΄μ‹±(hashing)이라고 ν•œλ‹€.
SHA-256, SHA-512 등을 μ‚¬μš©ν•˜κ³  SHA-512 μ‚¬μš©μ„ ꢌ고

// hash ν•¨μˆ˜ 쀑 Hash와 Hmac이 쑴재
// createHash
const hash = crypto.createHash('sha256');

// createHmac이용
const crypto = require('crypto');

const secret = 'abcdefg';
const hash = crypto.createHmac('sha256', secret)
                   .update('I love cupcakes')	// μ•”ν˜Έν™”ν•  κ°’
                   .digest('hex');	// 인코딩방식
console.log(hash);
// Prints:
// 0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e

Hashν•¨μˆ˜μ™€ Hmacν•¨μˆ˜μ˜ μ°¨μ΄λŠ” ν‚€ κ°’μ˜ 유무

πŸ±β€πŸ Salt λž€ ?

ν•΄μ‹œ μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•΄μ„œ λ³€ν™˜μ‹œν‚¨ ν•΄μ‹œκ°’μ€ 항상 κ³ μ •λœ 길이의 κ°’μœΌλ‘œ λ‚˜νƒ€λ‚˜κΈ° λ•Œλ¬Έμ— ν•œκ³„λ₯Ό 가지고 μžˆλ‹€. (쀑볡이 적게 λ‚˜νƒ€λ‚  수둝 쒋은 ν•΄μ‹œν•¨μˆ˜) λ‹¨μˆœνžˆ ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ λ³€ν™˜ν•œλ‹€κ³  ν•΄μ„œ μ™„λ²½ν•˜μ§€ μ•Šλ‹€. 이 점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ λΉ„λ°€λ²ˆν˜Έμ— SaltλΌλŠ” νŠΉμ • 값을 λ„£λŠ” 방법이 있고, ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ—¬λŸ¬λ²ˆ λŒλ¦¬λŠ” 방법이 μžˆλ‹€.
Node.js에 cryptoλΌλŠ” λ‚΄μž₯ λͺ¨λ“ˆμ΄ 쑴재, crypto λͺ¨λ“ˆμ˜ pbkdf2 λ©”μ„œλ“œλŠ” 단방ν–₯ μ•”ν˜Έν™”μ—μ„œ 많이 μ‚¬μš©.

// pbkdf2 λ©”μ†Œλ“œλŠ” μž…λ ₯κ°’(secret), salt, ν•΄μ‹œν•¨μˆ˜ 반볡횟수, ν•΄μ‹œ μ•Œκ³ λ¦¬μ¦˜
// 5개 인자λ₯Ό λ°›λŠ”λ‹€.
const crypto = require('crypto');
crypto.pbkdf2('secret', 'salt', 100000, 64, 'sha512', (err, 
  derivedKey) => {
    if (err) {
      throw err;
    }
    console.log(derivedKey.toString('hex'));  // '3745e48...08d59ae'
  });

해싱에 μ„±κ³΅ν•˜λ©΄ Bufferν˜•νƒœλ‘œ callback으둜 λ„˜κ²¨μ£ΌκΈ° λ•Œλ¬Έμ— derivedKey.toString('hex') --> hexλ°©μ‹μœΌλ‘œ λ¬Έμžμ—΄λ‘œ λ§Œλ“€μ–΄ μ€€λ‹€. (base64κ°€ 쒀더 짧은 λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€. base64, hexλŠ” 인코딩 방식)

✨ μš©μ–΄

  1. 레인보우 ν…Œμ΄λΈ”(rainbow table) : ν•΄μ‹œν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ§Œλ“€μ–΄λ‚Ό 수 μžˆλŠ” 값듀을 λŒ€λŸ‰μœΌλ‘œ μ €μž₯ν•œ ν…Œμ΄λΈ”. 이λ₯Ό μ΄μš©ν•΄μ„œ 해컀듀이 ν•΄ν‚Ή κ°€λŠ₯.
profile
TIL record

0개의 λŒ“κΈ€