๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒพBackEnd/๐ŸŒฑ Spring

์•”ํ˜ธํ™” Bcrypt์— ๋Œ€ํ•œ ์‹ฌ์ธต ๋ถ„์„

by MuGeon Kim 2023. 3. 24.
๋ฐ˜์‘ํ˜•

๊ธ€์„ ์ž‘์„ฑํ•˜๋Š” ์ด์œ 


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

 

์•”ํ˜ธํ™” & ๋ณตํ˜ธํ™”


์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…์„ ํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ณ  ์˜ˆ๋ฅผ ๋“ค์–ด ์ดํ•ด๋ฅผ ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์•”ํ˜ธํ™”๋ž‘ ๋ณตํ˜ธํ™”์— ๋Œ€ํ•ด ์งง๊ฒŒ ์„ค๋ช…์„ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ผ๋‹จ ์•”ํ˜ธํ™”๋ž€ ํ‰๋ฌธ์„ ์•”ํ˜ธ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ 123์„ ์ž…๋ ฅํ•˜๋ฉด ์•”ํ˜ธํ™” ๊ณผ์ •์„ ๊ฑฐ์ฒ˜ ํ‰๋ฌธ์„ ์•”ํ˜ธ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๊ธฐ์กด์˜ ์ˆซ์ž์— 3์„ ๋”ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์•”ํ˜ธํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด 456์œผ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์„ค์ •์ด ๋ฉ๋‹ˆ๋‹ค. 

๊ทธ๋Ÿฌ๋ฉด ๋ณตํ˜ธํ™”๋ž€ ์•”ํ˜ธ๋ฅผ ํ‰๋ฌธ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด์˜ ์•”ํ˜ธํ™”๋œ ์•”ํ˜ธ 456์„ -3์„ ํ†ตํ•ด ๊ธฐ์กด์— ์ž‘์„ฑํ•œ 123์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ถ€๋ถ„ ์ž…๋‹ˆ๋‹ค. ์•”ํ˜ธํ™”๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ๋œ ํ‰๋ฌธ์„ ๋ณตํ˜ธํ™”๋ฅผ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ ์•”ํ˜ธํ™”์˜ ์ข…๋ฅ˜์—๋Š” ๋ณตํ˜ธํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 

์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ์กด์˜ ์•”ํ˜ธ 123์„ +3 ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ ๋ชจ๋“  ๊ฐ’์„ ๋”ํ•˜๋Š” ์•”ํ˜ธํ™”๋ฅผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด 123 -> 6์œผ๋กœ ์•”ํ˜ธํ™”๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณตํ˜ธํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ์•”ํ˜ธํ™”์˜ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ์‹์€ Hash๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 

Hash๋Š” ์–ด๋– ํ•œ Data์„ N-Bit๋กœ ์ผ์ •ํ•œ ๊ธธ์ด์˜ ๋ฐ์ดํ„ฐ๋กœ ๋ฐ”๊พธ์–ด ์ค€๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ Hash Table์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

Hash Table์€ ๊ธฐ๋ณธ์ ์œผ๋กœ key๊ฐ’(string)์„ -> Integer(32bit)๋กœ ๋ณ€๊ฒฝ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์„ฑ๋Šฅ์œผ๋กœ๋Š” Hash ์ถฉ๋Œ์ด ์ ์–ด์•ผ์ง€ ์ข‹์Šต๋‹ˆ๋‹ค.

ํ•ด์‹œ ์ถฉ๋Œ์ด๋ž€

ํ•ด์‹œ ์ถฉ๋Œ์€ ์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค๊ฐ’์˜ ํ•ด์‹œ๊ฐ’์ด ๋˜‘๊ฐ™์„ ๋•Œ๋ฅผ ์˜๋ฏธ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ๊ธฐ์กด์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ 123์ด Hash Funtion()์„ ํ†ตํ•˜์—ฌ ์•”ํ˜ธํ™”๊ฐ€ ๋˜์–ด 6์ด ๋˜์—ˆ๊ณ  321์„ Hash Funtion()์„ ํ†ตํ•ด 6์ด ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๋‘๊ฐœ์˜ ํ‰๋ฌธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๋‹ค๋ฅด์ง€๋งŒ ํ•ด์‹œ๊ฐ’์ด ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ์šฐ๋ฆฌ๋Š” ํ•ด์‹œ ์ถฉ๋Œ์ด ์ผ์–ด๋‚ฌ๋‹ค๊ณ  ๋ง์„ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ•ด์‹œ ์ถฉ๋Œ์ด ์ ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ข‹์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ถฉ๋Œ์ด ๋ฐœ์ƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ๋ฒ•

1. Open Addressing ๋ฐฉ์‹

  • ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋ฏธ๋ฆฌ ์ •ํ•œ ๊ทœ์น™์— ๋”ฐ๋ผ ํ…Œ์ด๋ธ”์— ๋น„์–ด์žˆ๋Š” ๊ณต๊ฐ„์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋ฉฐ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

  • ์ด๋•Œ open addressing์€ 3๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ๋‹ค.

1-1. ์„ ํ˜• ์กฐ์‚ฌ๋ฒ•

  • ์ถฉ๋Œํ•œ ํ•ด์‹œ๊ฐ’์—์„œ ์ผ์ •๊ฐ’ ๋งŒํผ ๊ฑด๋„ˆ๋›ฐ์–ด ๋น„์–ด์žˆ๋Š” ๊ณต๊ฐ„์— ์ €์žฅ(๋”ํ•˜๊ธฐ)

 

1-2. ์ด์ฐจ ์กฐ์‚ฌ๋ฒ•

  • ์ถฉ๋Œํ•œ ํ•ด์‹œ๊ฐ’์—์„œ ์ผ์ •๊ฐ’ ๋งŒํผ ๊ฑด๋„ˆ๋›ฐ์–ด ๋น„์–ด์žˆ๋Š” ๊ณต๊ฐ„์— ์ €์žฅ(์ œ๊ณฑ)

→ ์ด๋•Œ ์ถฉ๋Œ์ด ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐœ์ƒํ•˜๋ฉด ์—ฌ๋Ÿฌ๋ฒˆ ๋›ฐ์–ด๋„˜๊ฒŒ ๋˜๊ณ  ๊ทธ๋Ÿฌ๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๋ง์ด ๋ฐœ์ƒํ•œ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ๋ง์€ ํŠน์ • ์˜์—ญ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชฐ๋ฆฐ๋‹ค. → ํ‰๊ท  ํƒ์ƒ‰ ์‹œ๊ฐ„์ด O(N)์œผ๋กœ ๋œ๋‹ค.

 

1-3. ์ค‘๋ณต ํ•ด์‹œ

  • ์„ ํ˜•๊ณผ ์ด์ฐจ ์กฐ์‚ฌ๋ฒ•์—์„œ ๋ฐœ์ƒํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ง์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด 2๊ฐœ์˜ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

2. Seperete Chaing๋ฐฉ์‹

  • Linked List๋ฅผ ์ด์šฉํ•˜์—ฌ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.

 

ํ•ด์‹œ ์ถฉ๋Œ์ด ์ ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Bcrypt)


์ถฉ๋Œ ์ €ํ•ญ์„ฑ

์ถฉ๋Œ์ด๋ž€ ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์ž…๋ ฅ m1๊ณผ m2๊ฐ€ ์žˆ์„ ๋•Œ h(m1) = h(m2)๊ฐ€ ๋˜๋Š” ์ƒํ™ฉ์„ ๋งํ•œ๋‹ค. ํ•ด์‹œ ํ•จ์ˆ˜์˜ ์ž…๋ ฅ์€ ๋ฌดํ•œํ•˜๋ฏ€๋กœ, ์ด์™€ ๊ฐ™์€ ์ถฉ๋Œ์„ ์ˆ˜์—†์ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•ด์‹œ ํ•จ์ˆ˜์— ์™„๋ฒฝํ•œ ์ถฉ๋Œ ํšŒํ”ผ๋ž€ ์—†๋‹ค. ๋‹จ์ง€ ์ถฉ๋Œ ์ €ํ•ญ์„ฑ์ด๋ผ๋Š” ์กฐ๊ฑด์€ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์€ ์žˆ์ง€๋งŒ ์ถฉ๋Œ ์Œ์€ ์ฐพ์„ ์ˆ˜ ์—†์–ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค.

 

์—ญ์ƒ ์ €ํ•ญ์„ฑ  (๋ณตํ˜ธํ™”๋ฅผ ํ•˜์ง€ ๋ชปํ•œ๋‹ค.)

ํ•ด์‹œ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋‹ค. ๊ทธ๋•Œ ์ด ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“œ๋Š” ์ž…๋ ฅ๊ฐ’ m์„ ์ฐพ๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์–ด๋ ค์šด์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

 

์ œ 2 ์—ญ์ƒ ์ €ํ•ญ์„ฑ

์ž…๋ ฅ๊ฐ’ m์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋Š” ์ƒํƒœ์—์„œ h(m) = x์„ ๋งŒ์กฑํ•˜๋Š” x๋ฅผ ์–ผ๋งˆ๋‚˜ ์ฐพ๊ธฐ ์‰ฌ์šด์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ฆ‰. ๋ณตํ˜ธํ™”๋ฅผ ๊ทธ๋ƒฅ ํ•˜์ง€๋Š” ๋ชปํ•˜์ง€๋งŒ h(m)์˜ ๊ฐ’์„ ๋‹ค๋ฅธ ๊ฐ’์ด๋ž‘ ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

Bcrypt

Bcrypt๋Š” ์œ„์— 3๊ฐ€์ง€ ๊ด€์ ์—์„œ ์•ˆ์ „ํ•œ ๋น„๋ฐ€๋ฒ„ํ˜ธ ์•”ํ˜ธํ™” ๊ธฐ๋ฒ•์ด๋‹ค.

๋‹จ๋ฐฉํ–ฅ ํ•ด์‹œ ํ•จ์ˆ˜๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด h(m)์œผ๋กœ ํ•ด์‹œ ๊ฐ’์„ ๋งŒ๋“ค์–ด ์•”ํ˜ธํ™”๋ฅผ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋•Œ ์›๋ž˜์˜ ์•”ํ˜ธํ™”๋ฅผ ์ฐพ๊ธฐ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. (์—ญ์ƒ ์ €ํ•ญ์„ฑ)

๊ทธ๋ฆฌ๊ณ  ์ถฉ๋Œ ์ €ํ•ญ์„ฑ์˜ ๊ด€์ ์œผ๋กœ ์‚ดํŽด๋ณด๋ฉด Bcrypt๋Š” ์†”ํŠธ ๊ฐ’์„ ์‚ฌ์šฉํ•ด์„œ ํ•ด์‹œ ๊ฐ’์„ ์ƒ์„ฑํ•œ๋‹ค. ์œ„์— ์„ค๋ช…ํ•œ ๋ฐฉ์‹์ฒ˜๋Ÿผ ์„œ๋กœ ๋‹ค๋ฅธ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•ด ์›๋ณธ ๋น„๋ฐ€๋ฒˆํ˜ธ์— ๋ฌด์ž‘์œ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ํ•ญ์ƒ ๋‹ค๋ฅธ ํ•ด์‹œ ๊ฐ’์ด ์ƒ์„ฑ๋œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ œ2 ์—ญ์ƒ ์ €ํ•ญ์„ฑ์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๋ฉด ํ•ด์‹œ ํ•จ์ˆ˜์—์„œ ์ž…๋ ฅ ๊ฐ’์ด ๊ณ ์ •๋˜์–ด ์žˆ์„ ๋•Œ ๊ทธ ํ•ด์‹œ ๊ฐ’๊ณผ ๋™์ผํ•œ ํ•ด์‹œ ๊ฐ’์„ ๊ฐ€์ง„ ๋‹ค๋ฅธ ์ž…๋ ฅ ๊ฐ’์„ ์ฐพ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์ž…๋ ฅ ๊ฐ’์ด ๊ณ ์ •๋˜์–ด ์žˆ์„ ๋•Œ ํ•ด๋‹น ์ž…๋ ฅ ๊ฐ’์˜ ํ•ด์‹œ ๊ฐ’๊ณผ ๋™์ผํ•œ ํ•ด์‹œ ๊ฐ’์„ ๊ฐ€์ง„ ๊ฐ’์„ ์ฐพ๊ธฐ๋Š” ์„œ์˜ ๋ถˆ๊ฐ€๋Šฅ ํ•ฉ๋‹ˆ๋‹ค.

 

bcrypt - Wikipedia

From Wikipedia, the free encyclopedia Password-based key derivation function bcrypt is a password-hashing function designed by Niels Provos and David Mazières, based on the Blowfish cipher and presented at USENIX in 1999.[1] Besides incorporating a salt t

en.wikipedia.org

 

 

์•”ํ˜ธํ™” ํ•ด์‹œ ํ•จ์ˆ˜ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „. ์•”ํ˜ธํ™” ํ•ด์‹œ ํ•จ์ˆ˜(cryptographic hash function)์€ ํ•ด์‹œ ํ•จ์ˆ˜์˜ ์ผ์ข…์œผ๋กœ, ํ•ด์‹œ ๊ฐ’์œผ๋กœ๋ถ€ํ„ฐ ์›๋ž˜์˜ ์ž…๋ ฅ๊ฐ’๊ณผ์˜ ๊ด€๊ณ„๋ฅผ ์ฐพ๊ธฐ ์–ด๋ ค์šด ์„ฑ์งˆ์„ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์•”

ko.wikipedia.org

 

๋ฐ˜์‘ํ˜•