Bcrypt

mseo39ยท2024๋…„ 4์›” 14์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
3/4
post-thumbnail

๐Ÿ‘ฉโ€๐Ÿ’ป ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ค ์•”ํ˜ธํ™”๋ฅผ ์“ธ ๊ฒƒ์ธ์ง€ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ Bcrypt๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ด Bcrypt๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ์ž‘์„ฑํ•ด๋ณด๊ฒ ๋‹ค!

์ฐธ๊ณ 

  • ISO-27001 ๋ณด์•ˆ ๊ทœ์ •์„ ์ค€์ˆ˜ํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด๋ฉดย PBKDF2๋ฅผ ์‚ฌ์šฉํ•˜์ž.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทœ์ •์„ ์ค€์ˆ˜ํ•ด์•ผํ•  ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ฉด ๊ตฌํ˜„์ด ์‰ฝ๊ณ  ๋น„๊ต์  ๊ฐ•๋ ฅํ•œย Bcrypt๋ฅผ ์‚ฌ์šฉํ•˜์ž.
  • ๋ณด์•ˆ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ๋งŽ์€ ๋น„์šฉ์„ ํˆฌ์žํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด,ย Scrpyt๋ฅผ ์‚ฌ์šฉํ•˜์ž.

Bcrypt

๋‹จ๋ฐฉํ–ฅ ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํ•ด์‹œ ํ•จ์ˆ˜

๐Ÿ™‹โ€โ™€๏ธ ์˜ค๋Š˜ ๊ณต๋ถ€ํ•  ๊ฒƒ์€?

  • ๋‹จ๋ฐฉํ–ฅ ์•”ํ˜ธํ™”
  • ๋‹จ๋ฐฉํ–ฅ ์•”ํ˜ธํ™” ํ•œ๊ณ„
    • ์†”ํŒ…
    • ํ‚ค ์ŠคํŠธ๋ ˆ์นญ
  • Bcrypt

ํ•ด์‹œ ํ•จ์ˆ˜

  1. ์ž„์˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์ •๋œ ๊ธธ์ด(์••์ถ• ํ•จ์ˆ˜)๋กœ ๋งคํ•‘ํ•˜๋Š” ํ•จ์ˆ˜
  2. ๋™์ผํ•œ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ๋™์ผํ•œ ์ถœ๋ ฅ๊ฐ’
  3. ์ž…๋ ฅ๊ฐ’์ด ์•ฝ๊ฐ„ ๋ณ€๊ฒฝ๋˜์–ด๋„ ๋‹ค๋ฅธ ์ถœ๋ ฅ๊ฐ’

๋‹จ๋ฐฉํ–ฅ ์•”ํ˜ธํ™”

  • ํ•œ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ์•”ํ˜ธํ™”๋ฅผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
    • ์ฆ‰, ์•”ํ˜ธํ™”๋งŒ ๊ฐ€๋Šฅํ•˜๊ณ  ๋ณตํ˜ธํ™”๋Š” ํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋‹จ๋ฐฉํ–ฅ ์•”ํ˜ธํ™” ๋ฐฉ์‹์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ ํŒจ์Šค์›Œ๋“œ DB๊ฐ€ ์œ ์ถœ๋˜์–ด๋„ ์•ˆ์ „ํ•˜๋‹ค.
  • ํŒจ์Šค์›Œ๋“œ๋ฅผ ๊ฒ€์ฆํ•  ๋•Œ์—๋Š” ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›์€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์•”ํ˜ธํ™”๋œ ํŒจ์Šค์›Œ๋“œ๋ผ๋ฆฌ ๋น„๊ตํ•œ๋‹ค.
  • ๊ทธ๋ž˜์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žŠ์–ด๋ฒ„๋ฆฌ๋ฉด ์ฐพ๊ธฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด ์ƒˆ๋กœ์šด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค.
    • ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ๋ฉ”์ผ
    • SMS์ธ์ฆ

๐Ÿค” ์™œ ์–‘๋ฐฉํ–ฅ์ด ์•„๋‹Œ ๋‹จ๋ฐฉํ–ฅ์„ ์„ ํƒํ–ˆ๋Š”์ง€

์–‘๋ฐฉํ–ฅ์€ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•”ํ˜ธํ™” ๋ฐ ๋ณตํ˜ธํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ํ‚ค๊ฐ€ ์œ ์ถœ๋˜์ง€ ์•Š๋„๋ก ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ถœ๋  ๊ฑฑ์ •์ด ํ•„์š”์—†๋Š” ๋‹จ๋ฐฉํ–ฅ์„ ์„ ํƒํ–ˆ๋‹ค.

๐Ÿ’ก ๊ถ๊ธˆํ•œ์  - ๋ณตํ˜ธํ™”๊ฐ€ ์™œ ๋ถˆ๊ฐ€๋Šฅ?

์ˆ˜ํ•™์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค!

๋Œ€๋ถ€๋ถ„์˜ ๋‹จ๋ฐฉํ–ฅ ์•”ํ˜ธํ™” ํ•จ์ˆ˜๋Š” ์ˆ˜ํ•™์ ์œผ๋กœ ์—ญํ•จ์ˆ˜๋ฅผ ์ฐพ๊ธฐ ์–ด๋ ต๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค. ์ด๋Š” ์ฃผ์–ด์ง„ ์•”ํ˜ธ๋ฌธ์œผ๋กœ๋ถ€ํ„ฐ ์›๋ฌธ์„ ๋ณต๊ตฌํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ!

๐Ÿ”“ ๋‹จ๋ฐฉํ–ฅ ์•”ํ˜ธํ™”์˜ ํ•œ๊ณ„

๐ŸŒˆ Rainbow Table

์œ„์—์„œ ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ๋™์ผํ•œ ์ž…๋ ฅ๊ฐ’์—๋Š” ๋™์ผํ•œ ์ถœ๋ ฅ๊ฐ’์„ ์ค€๋‹ค๊ณ  ํ–ˆ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•ด ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํ•ด์‹œ ๊ฐ’์„ ์ €์žฅ์‹œ์ผœ ๋†“์€ ํ‘œ๋ฅผ ๋งํ•œ๋‹ค.

๐Ÿ’ก ๊ทธ๋ž˜์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๐Ÿง‚ salt

๋น„๋ฐ€๋ฒˆํ˜ธ์— ์ž„์˜์˜ ๋ฌธ์ž์—ด์ธ salt๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ถœ๋ ฅ๊ฐ’์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋‹จ์ˆœํ•˜๋”๋ผ๋„ ๋ ˆ์ธ๋ณด์šฐ ํ…Œ์ด๋ธ”์—์„œ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค.

*salt๋Š” ์ตœ์†Œ 128bit์ •๋„๋Š” ๋˜์–ด์•ผ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.

๐Ÿงฉ Brute Force ๊ณต๊ฒฉ (๋ฌด์ฐจ๋ณ„ ๋Œ€์ž… ๊ณต๊ฒฉ)

ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ์›๋ž˜ ๋น ๋ฅธ ๋ฐ์ดํ„ฐ์˜ ๊ฒ€์ƒ‰์„ ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด์ปค๋Š” ๋น ๋ฅธ ์†๋„๋กœ ์ž„์˜์˜ ๋ฌธ์ž์—ด์˜ ์ถœ๋ ฅ๊ฐ’๊ณผ ํ•ดํ‚นํ•  ๋Œ€์ƒ์˜ ์ถœ๋ ฅ๊ฐ’์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ก ๊ทธ๋ž˜์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ‚ค ์ŠคํŠธ๋ ˆ์นญ

ํ•ด์‹ฑ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ์‹œ๊ฐ„์„ ๋Š˜๋ฆผ์œผ๋กœ์จ ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž… ๊ณต๊ฒฉ์— ๋Œ€๋น„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ”’ Bcrypt

Blowfish ์•”ํ˜ธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋œ ์•”ํ˜ธํ™” ํ•จ์ˆ˜์ด๋ฉฐ ํ˜„์žฌ๊นŒ์ง€ ์‚ฌ์šฉ์ค‘์ธ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ํ•ด์‹œ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ค‘ ํ•˜๋‚˜

๋ ˆ์ธ๋ณด์šฐ ํ…Œ์ด๋ธ” ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์†”ํŒ…๊ณผ ํ‚ค ์ŠคํŠธ๋ ˆ์นญ์„ ์ ์šฉํ•œ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ

  • ๋‚ด๋ถ€์ ์œผ๋กœ ๋žœ๋ค ํ•œ ๐Ÿง‚ salt๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด์„œ ๋งค๋ฒˆ ๋‹ค๋ฅธ ํ•ด์‹ฑ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜
    • ๐ŸŒˆ๋ ˆ์ธ๋ณด์šฐ ํ…Œ์ด๋ธ” ๊ณต๊ฒฉ ๋ฐฉ์ง€
    • ๋˜ํ•œ, ํ•ด์‹œ ๊ฐ’ ๋‚ด๋ถ€์— salt ๊ฐ’์ด ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ์— salt ๊ฐ’์„ ๋”ฐ๋กœ ์ €์žฅํ•˜์ง€ ์•Š์•„๋„ ๋จ
    • ํ•ด์‹ฑ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” String์˜ ๊ธธ์ด๋Š” ๋งค๋ฒˆ 60์œผ๋กœ ๋™์ผ
  • ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ๋Š˜๋ ค์„œ ์—ฐ์‚ฐ ์†๋„๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ๋‹ค
    • ๐Ÿงฉ Brute Force ๊ณต๊ฒฉ ๋ฐฉ์ง€

Bcrypt ๊ตฌ์กฐ


1. ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‚˜ํƒ€๋‚ธ๋‹ค 2b๋Š” bcrypt๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค
2. ํ‚ค ์ŠคํŠธ๋ ˆ์นญ์œผ๋กœ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค(2^15)
3. 16๋ฐ”์ดํŠธ(128๋น„ํŠธ) salt, 22์ž๋กœ ์ธ์ฝ”๋”ฉ๋œ base64
4. 24๋ฐ”์ดํŠธ(192๋น„ํŠธ) ํ•ด์‹œ, 31์ž๋กœ ์ธ์ฝ”๋”ฉ๋œ base64

๐Ÿ’ก ๊ทธ๋Ÿผ salt๊ฐ’์„ ์•Œ ์ˆ˜ ์žˆ๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€? ๋ฌด์Šจ ์†Œ์šฉ์ด์ง€..?

๊ทธ๋ ‡๋‹ค,, salt๋ฅผ ์•Œ์•„๋„ ํ•ด๋‹น salt์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์ž„์˜์˜ ๋ฌธ์ž์—ด์„ ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…์„ ํ•ด๋ณด์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๊ฒฉํ•˜๋Š” ์‚ฌ๋žŒ ์ž…์žฅ์—์„œ๋Š” ๊ณค๋ž€ํ•˜ใ„ท ใ…,,

์ฆ‰, salt์˜ ๋ ˆ์ธ๋ณด์šฐ ํ…Œ์ด๋ธ” ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์—„์ฒญ๋‚˜๊ฒŒ ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ ˆ์ธ๋ณด์šฐ ํ…Œ์ด๋ธ” ์ƒ์„ฑ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค

๋˜ํ•œ Bcrypt๋Š” ํšŒ์›๋งˆ๋‹ค ๋‹ค๋ฅธ salt๋ฅผ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋ถ€๋‹ด์ด ๋˜๋Š” ๊ฒƒ

๐Ÿ’ก salt๊ฐ€ ๋งค๋ฒˆ ๋‹ฌ๋ผ์ง€๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ๋งค์นญํ•˜๋Š”๊ฑธ๊นŒ?

์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด salt๋Š” 22์ž๋กœ ์ธ์ฝ”๋”ฉ๋œ base64๋ผ๊ณ  ํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ•ด๋‹น ํšŒ์›์˜ ๊ฐ’์„ ๊ฐ€์ ธ์™€ salt๋ถ€๋ถ„์„ ๋””์ฝ”๋”ฉํ•˜๊ณ  ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์–ป์€ ๊ฐ’์„ ์ด์šฉํ•ด Bcrypt ์•”ํ˜ธํ™”ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์žˆ๋Š” ๊ฐ’๊ณผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด๋‹ค

์ฝ”๋“œ

1) ์„ค์น˜
pip install bcrypt

import bcrypt
password = '1234'

2) ์•”ํ˜ธํ™”
b = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())

3) ๋งค์นญ
c = '1234'
bcrypt.checkpw(c.encode('utf-8'), b)

์ฐธ๊ณ ์ž๋ฃŒ

ps.. ๊ธ€์“ด์ด์˜ ์ž๋ฃŒ ๋งŒ๋“œ๋Š” ์‹ค๋ ฅ์ด ๋Š˜๊ณ  ์žˆ๋‹ค,,๊ทธ๋ž˜๋„ ์ดํ•ดํ•œ๊ฑธ ํ† ๋Œ€๋กœ ์ •๋ฆฌํ•˜๋Š” ๊ฑฐ๋‹ˆ,,์ข‹๋‹ค,,๐Ÿ˜ข(์šฐ๋Š”๊ฑฐ ์•„๋‹ˆ๋ผ ๋•€,,)

profile
ํ•˜๋ฃจํ•˜๋ฃจ ์„ฑ์‹คํ•˜๊ฒŒ

0๊ฐœ์˜ ๋Œ“๊ธ€