์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ๊น๋ฏธ๊ฒฝ์๋งํ์์
- ๋ ์
- Python
- html
- ํ๋ก๊ทธ๋๋ฐ
- ์นํ์ด์ง๋ง๋ค๊ธฐ
- ์๋ฐ์คํฌ๋ฆฝํธ
- css
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- ์ฑ
- K๋ฐฐํฐ๋ฆฌ
- ๋ฐ์ํ
- ์ค๋ผํด
- ์๋ฐ
- ๊ฐ๋ฐ
- ์นํผ๋ธ๋ฆฌ์ฑ
- ํ์ด์ฌ
- ๋ผํ๋ผ์ค์๋ง๋
- ์ค๋ธ์
- ์ํ
- Java
- ๋ง์ผ๋ด๊ฐ์ธ์์๋ค์์ฐ๋ค๋ฉด
- ComputerScience
- ๋ฆฌ์กํธ
- ์ปดํจํฐ๊ณผํ
- K๋ฐฐํฐ๋ฆฌ๋ ๋ณผ๋ฃจ์
- JavaScript
- ์ฝ๋ฉ
- database
- Today
- Total
JiYoung Dev ๐ฅ
OTP์ ๋์ ์๋ฆฌ, HOTP์ TOTP ์ดํดํ๊ธฐ ๋ณธ๋ฌธ
์๋ ํ์ธ์. ์ค๋์ ๊ธ์ต ๊ฑฐ๋์์ ์์ฃผ ์ฐ์ด๋ ๊ทธ๋ฆฌ๊ณ ์ต๊ทผ์๋ ๋ก๊ทธ์ธ 2์ฐจ ์ธ์ฆ์ผ๋ก๋ ์์ฃผ ์ฐ์ด๋ OTP์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค. OTP๋ ๋ฌด์์ธ์ง ์์๋ณด๊ณ , OTP์ ์ข ๋ฅ์ธ HOTP์ TOTP๊ฐ ์ด๋ ํ ์๋ฆฌ๋ก ๋์ํ๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
OTP(One Time Password) ์ ์
- OTP๋ One-Time password๋ก ํ ๋ฒ๋ง ์ฌ์ฉํ ์ ์๋ ๋น๋ฐ๋ฒํธ๋ฅผ ๋งํฉ๋๋ค.
- OTP๋ ๋งค๋ฒ ์๋ก์ด ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑํ๋ฏ๋ก, ์ฌ์ฌ์ฉ์ฑ์ด ๋ถ๊ฐ๋ฅํ๊ณ ๋ณด์์ฑ์ด ๋๋ค๋ ํน์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
OTP ๋๊ธฐํ ๋ฐฉ์
- ์๋ฒ์ ํด๋ผ์ด์ธํธ(๋๋ ํ ํฐ) ์ฌ์ด์ ๋ฏธ๋ฆฌ ์ฝ์๋ ๊ท์น์ ์ํด์ ํด๋ผ์ด์ธํธ ์ชฝ์์ ์์ฑํ ์ผํ์ฉ ์ํธ๋ฅผ ์๋ฒ ์ธก์ ๋ณด๋ด๋ฉด ์๋ฒ ์ธก๋ ๊ฐ์ ๊ท์น์ ์ํด ์ฌ์ฉ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋น๋ฐ๊ฐ์ ๊ฐ์ ธ์จ ํ, ์ผํ์ฉ ์ํธ๋ฅผ ์์ฑํ์ฌ ์๋ก ๋น๊ตํ๋ ํ์์ ๋๋ค.
OTP์ ๋์์๋ฆฌ
- ๋น๋ฐํค ์์ฑ(Secret Key Generation)
- ์ฌ์ฉ์์ ์์คํ
๊ฐ์ ๊ณต์ ๋๋ ๋น๋ฐํค(secret key) ์์ฑ
- ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ๋๋ฉฐ ํด๋น ๋น๋ฐํค์ ๋ค๋ฅธ ์ ๋ณด(ex. ์นด์ดํธ ๋ฑ)๋ฅผ ํ ๋๋ก ์ผํ์ฉ ๋น๋ฐ๋ฒํธ๊ฐ ์์ฑ๋จ
- ์ฌ์ฉ์์ ์์คํ
๊ฐ์ ๊ณต์ ๋๋ ๋น๋ฐํค(secret key) ์์ฑ
- ์๊ฐ ์ ๋ณด ์ฌ์ฉ(Time-Based OTP - TOTP) ๋๋ ์นด์ดํฐ ์ฌ์ฉ(HMAC-Based OTP - HOTP)
- TOTP(Time-Based OTP) : ํน์ ์๊ฐ(์: 30์ด)๋ง๋ค ์๋ก์ด OTP ์์ฑ, ์๊ฐ ์ ๋ณด์ ๋น๋ฐํค๋ฅผ ์กฐํฉํ์ฌ OTP๋ฅผ ๊ณ์ฐํจ
- HOTP(HMAC-Based OTP) : ์ฌ์ฉ์์ ์ธ์ ๋๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ์๋ก์ด OTP๋ฅผ ์์ฑํจ. ์ผ์ ํ ์นด์ดํฐ์ ๋น๋ฐํค๋ฅผ ์กฐํฉํ์ฌ OTP๋ฅผ ๊ณ์ฐ
- OTP ์์ฑ(OTP Generation)
- TOTP : ํ์ฌ ์๊ฐ ๋๋ ์๊ฐ ๊ฐ๊ฒฉ์ ์ฌ์ฉํ์ฌ ๋น๋ฐํค์ ์กฐํฉํ์ฌ ์ผํ์ฉ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑ
- HOTP : ์นด์ดํฐ์ ๋น๋ฐํค๋ฅผ ์กฐํฉํ์ฌ ์ผํ์ฉ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑ
- OTP ์ ๋ฌ(OTP Delivery)
- ์ฌ์ฉ์์๊ฒ ์์ฑ๋ OTP๋ฅผ ์์ ํ๊ฒ ์ ๋ฌ
- ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ฐ์ผ ์ฑ(์: Google Authenticator)๋ฅผ ํตํด QR ์ฝ๋๋ฅผ ์ค์บํ๊ฑฐ๋, ํ ์คํธ ํ์์ OTP๋ฅผ ์ ๋ ฅํ๋๋ก ์ ๋ํจ
- OTP ๊ฒ์ฆ(OTP Verification)
- ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ OTP์ ์์คํ ์์ ์์ฑํ OTP๋ฅผ ๋น๊ตํ์ฌ ์ผ์น ์ฌ๋ถ๋ฅผ ํ์ธ
- ์ธ์ฆ ๊ฒฐ๊ณผ(Authentication Result)
- OTP๊ฐ ์ผ์นํ๋ฉด, ์ธ์ฆ์ด ์ฑ๊ณตํ๊ณ ์ฌ์ฉ์์๊ฒ ์ ๊ทผ์ ํ์ฉํจ
- OTP๊ฐ ์ผ์นํ์ง ์์ผ๋ฉด, ์ธ์ฆ์ด ์คํจํ๊ณ ์ ๊ทผ์ ๊ฑฐ๋ถํจ
์ง๊ธ๊น์ง๋ OTP์ ๊ฐ๋จํ ์ ์์ ๋์์๋ฆฌ๋ฅผ ์ด์ผ๊ธฐํด๋ณด์์ต๋๋ค. ์ค์ ๋ก OTP๋ HOTP์ TOTP ๋๊ฐ์ง ์ข ๋ฅ๊ฐ ์์ต๋๋ค. ์๋ ์๋ฆฌ๋ ์ ์ฌํ์ง๋ง ์ฐจ์ด์ ์ด ์๊ธฐ ๋๋ฌธ์ ๋ณด๋ค ์์ธํ๊ฒ ํด๋น OTP์ ์๋ฆฌ์ ๋ํด ์๊ฐํ๊ฒ ์ต๋๋ค.
TOTP์ HOTP
๋ณธ๋ก ์ ๋ค์ด๊ฐ๊ธฐ ์ ๊ฐ๋จํ ์๊ฐํ์๋ฉด HOTP๋ HMAC ๊ธฐ๋ฐ์ OTP์ด๋ฉฐ, TOTP๋ HOTP์์ Counter ๊ฐ ๋์ TimeStamp๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋๋ค.
1. HOTP
HMAC ๊ธฐ๋ฐ์ OTP๋ก ์ด๊ธฐ OTP ๋ชจ๋ธ์ ๋๋ค.
HMAC = Hash based MAC(Message Authentication Code)์ผ๋ก ํด์ ๊ธฐ๋ฐ์ ๋ฉ์์ง ์ธ์ฆ ์ฝ๋์ ๋๋ค.
2๋ฒ์ Hash ํจ์์ 1๊ฐ์ ๋น๋ฐํค๋ฅผ ์ฌ์ฉํ๋ฉฐ Hash ํจ์๋ก๋ MD5, SHA-1, SHA-256, SHA-512 ๋ฑ์ ์ฌ์ฉํฉ๋๋ค.
HOTP์ ์ฌ์ฉ๋๋ HMAC ์๊ณ ๋ฆฌ์ฆ์ ์๋์ ๊ฐ์ด ๋์ํฉ๋๋ค.
HMAC
- ์ธ์ฆํ ๋ฐ์ดํฐ์ ๊ณต์ ๋น๋ฐํค์ ๋ํด ์ํธํ ํด์ ํจ์(์. SHA1, SHA256)๋ฅผ ์คํํ์ฌ ์ป์ ๋ฉ์์ง ์ธ์ฆ์ฝ๋
HMAC(K, text) = H(K xor Opad + H(K xor Ipad + message))
- K๋ Secret Key ์ 3์๊ฐ ์์ง ๋ชปํ๋ ๋น๋ฐ ํ ์คํธ
- H๋ ํด์ํจ์ MD5 Sha-256 ๋ฑ ๋ค์ํ ํด์ ์ฌ์ฉ๊ฐ๋ฅ
- Opad๋ Output padding K์ ๊ธธ์ด ๋งํผ 0x5C ๋ฅผ ๋ฐ๋ณต
- Ipad๋ Output padding K์ ๊ธธ์ด ๋งํผ 0x36 ๋ฅผ ๋ฐ๋ณต
- H - ์ํธํ๋ฅผ ์ํ ํด์ ํจ์ (MD5, SHA-1, SHA-224, SHA-256, SHA-512 ๋ฑ ์ฌ์ฉ)
- m - ์ธ์ฆ์ด ํ์ํ ๋ฉ์์ง (HOTP์์๋ ์นด์ดํฐ, TOTP์์๋ ์๊ฐ)
- K - ๋น๋ฐํค
- || - ๋ฌธ์์ด ์ฐ๊ฒฐ ์ฐ์ฐ
- ๋นํธ XOR ์ฐ์ฐ
- opad - ๋ธ๋ญ ์ฌ์ด์ฆ๋ฅผ ๊ฐ์ง ์ธ๋ถ ํจ๋ฉ (0x5c ๊ฐ์ผ๋ก ์ฑ์)
- ipad - ๋ธ๋ญ ์ฌ์ด์ฆ๋ฅผ ๊ฐ์ง ๋ด๋ถ ํจ๋ฉ (0x36 ๊ฐ์ผ๋ก ์ฑ์)
- 0x5c = 01011100(2) ⇒ ํค์ ๊ฐ ๋นํธ๋ฅผ ๋ค์ง์ด์ ์ฌ์ฉ
- 0x36 = 00110110(2) ⇒ ์ฌ์ฉํ๋ ํค์ ๊ฐ ๋นํธ๋ฅผ ๊ทธ๋๋ก ์ ์งํ๋ฉด์ ์ฌ์ฉ
- ipad์ opad์ ์๋ก ๋ค๋ฅธ ๊ฐ์ ์ฌ์ฉํจ์ผ๋ก์จ ํค๋ฅผ ์๋ก ๋ค๋ฅด๊ฒ ๋ณํ → ํด์ ํจ์์ ๋ํ ์์ ์ฑ์ ๋์ด๊ณ , ๋ ํจ๋ฉ ๊ฐ์ด ๋ ๋ฆฝ์ ์ผ๋ก ์ ํ๋์ด ์๋ก ๋ค๋ฅธ ๋ณํ์ ์ํํจ์ผ๋ก์จ ๋ณด์ ๊ฐํ๋ฅผ ์ด๋์ด๋
- ๋ ๊ฐ์ ๊ฐ๋ค์ด XOR ์ฐ์ฐ์ ํตํด ํค๋ฅผ ๋ณํํ ๋ ํจ๊ณผ์ ์ธ ๋นํธ ํจํด์ ์์ฑํ๊ธฐ ๋๋ฌธ(ํธ์์ ์ ํ๋ ๊ฐ). ์ฆ, ํค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ณํ์ํฌ ์ ์๋ ๊ฐ ์ค ๋ถ์๊ณผ ๊ฒ์ฆ์ ํตํด ์ ํ๋ ๊ฐ.
- ์ ๋๊ฐ์ ๊ฐ์ด 1๊ณผ 0์ด ๋ฒ๊ฐ์๊ฐ๋ฉด์ ๋ํ๋๋ ํจํด์ ์์ฑํจ. ์ด๋ฌํ ํจํด์ ํค์ ๊ฐ ๋นํธ๋ฅผ ๋ค๋ฅด๊ฒ ๋ณํ์ํฌ ๋ ํจ๊ณผ์ ์ด๋ฉฐ, ์ด๋ ํด์ ํจ์์ ๋ํ ์์ธก์ ์ด๋ ต๊ฒ ๋ง๋ค์ด ๋ณด์์ฑ์ ๋์
HOTP๋ ์์ HMAC ์๊ณ ๋ฆฌ์ฆ์์ message ๋์ Counter๋ผ๋ ๋ณ์๋ฅผ ์ ๋ ฅ๋ฐ์ HMAC์ ์์ฑํ ๋ค Truncateํ๋ ๊ณผ์ ์ ๊ฑฐ์ณ ์ผ์ ์๋ฆฌ์์ ์ซ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
** Truncate : ๋์ ์ผ๋ก string์ ์๋ฅด๋ ์์
HOTP(K, counter) = Truncate(HMAC-SHA-1(K, counter))
Truncate
1. SHA-1 ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํ HMAC(K, Counter)๋ก ์์ฑ๋ Hash๋ 20byte์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง
-
- Hash ๊ฒฐ๊ณผ ๊ฐ์ 16์ง์ ⇒ 1๊ฐ์ 16์ง์๋ 4bit, 2๊ฐ์ 16์ง์๊ฐ 16byte
- ๋ง์ง๋ง 4bit์ ์๋ก ๊ทธ๋ฃน์ offset ํ์ธ ⇒ a (10)
- ํด๋น offset + ๋ค์ 3๊ฐ์ ๊ทธ๋ฃน๊น์ง์ 16์ง์ ์ถ์ถ (์ด 4๊ทธ๋ฃน) ⇒ DBC(Dinamic Binary Code)
- ํด๋น ๊ฐ์ด OTP ์ซ์๋ฅผ ๋ง๋๋๋ฐ ์ฐ์ผ ์์
2. DBC์ ์ฒซ Byte๋ 0x7f์ AND ์ฐ์ฐ ์ํ(MASK ์ฐ์ฐ)
- 0x7f & 0x58 ⇒ 0111 1111 & 0101 1000 ⇒ 0101 1000
- 0x7f ⇒ ์ต์์ ๋นํธ๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋นํธ๊ฐ 1
- 0 & 0 ⇒ 0, 0 & 1 ⇒ 0 ์ด๋ฏ๋ก ์ด๋ค ์์ ์ฐ์ฐ์ ํ๋์ง 0์ด๋จ ⇒ ํญ์ ์์๋ฅผ ๋ปํจ
- ๋๋จธ์ง๋ 1 ⇒ 1 & 0 ⇒ 0, 1 & 1 ⇒ 1์ด๋ฏ๋ก ์ด๋ค ์๊ฐ ๋์ค๋๋ผ๋ ์๋์ ์๋ฅผ ๊ฐ์ง๊ฒ ๋๊ธฐ ๋๋ฌธ
- DBC ๊ฒฐ๊ณผ : 0x58838990 ⇒ 10์ง์๋ก ์นํํ๋ฉด 1485015440(10์๋ฆฌ์)
- 10์ง์๋ก ์นํ๋ DBC ๊ฐ์ 10์ 6์น์ผ๋ก Mod ์ฐ์ฐ
- ⇒ ๊ฒฐ๊ณผ : 15440 ⇒ 6์๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ ๋งจ ์์ 0์ ์ถ๊ฐ
- HOTP : 015440
์๋์์
- ์ฌ์ฉ์๊ฐ OTP ๋จ๋ง์ ๋ฒํผ์ ๋๋ฅธ๋ค
- Counter + 1
- Counter์ Secret Key ⇒ HMAC(K, Counter) ⇒ Truncate(HMAC(K, Counter)) ⇒ OTP ๋ฒํธ ์์ฑ
- ์ฌ์ฉ์๋ ์๋ฒ๋ก OTP ๋ฒํธ๋ฅผ ์ ์กํ๋ค.
- ์๋ฒ๋ ๊ธฐ์กด ๋ณด์ ํ Counter, Secret key๋ฅผ ํตํด 3๋ฒ๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก OTP ๋ฒํธ๋ฅผ ์์ฑํ๋ค.
- 5์์ ์์ฑํ OTP ๋ฒํธํ ์ฌ์ฉ์๊ฐ ์ ์กํ OTP ๋ฒํธ๊ฐ ๊ฐ์ผ๋ฉด ์ธ์ฆ ์๋ฃ
- ์ธ์ฆ์ด ์๋ฃ๋๋ฉด ์๋ฒ์ Counter + 1
2. TOTP
- TOTP๋ HOTP์์ Counter ๊ฐ์ ์๊ฐ(Time Stamp)๋ก ๋์ฒดํ๋ ๊ฒ
- ๊ธฐ์กด์ HMAC์ด ์ฐ์ฐ๊ฐ์ ๋จ์ํ๊ฒ ์ฆ๊ฐ์ํค๋ HMAC-SHA-1 ์๊ณ ๋ฆฌ์ฆ์์ ์ผ์ ์๊ฐ๋ง๋ค ๊ฐ์ด ๋ณ๊ฒฝ๋๋๋ก ํ HMAC-SHA-256์ด๋ HMAC-SHA-512 ํจ์๋ฅผ ์ฌ์ฉ
- ํน์ ์๊ฐ(๋ณดํต 30์ด ํน์ 60์ด)๋ง๋ค ๊ทธ ๋ค์ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ๋จ
- ํ์ง๋ง ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์๊ฐ ์ฐจ์ด ๋๋ฌธ์ ์ ๋๋ก ์ธ์ฆ์ด ๋์ง ์๋ ๊ฒฝ์ฐ๋ ์์ ⇒ ๋๊ธฐํ ๋ฐฉ๋ฒ ํ์
TOTP = HOTP(K, T)
- UT(UnixTime, UTC of January 1, 1970 ์ดํ ๊ฒฝ๊ณผ๋ ํ์ฌ์๊ฐ(๋จ์: ์ด))
- UT๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ก ๋๊ธฐํ๋จ
3. HOTP vs TOTP
ํ์ํญ๋ชฉ | Shared Secret Key, Counter | Shared Secret key, Time Stamp |
HMAC ๋ฉ์์ง | ์ด๋ฒคํธ ๋ฐ์์ ๊ฐ์ด ์ฆ๊ฐํ๋ Counter | ์๊ฐ์ ์์กดํ์ฌ ๊ฐ์ด ์ฆ๊ฐํ๋ Counter |
์ ํจ์๊ฐ | ์์ธก ๋ถ๊ฐ๋ฅ | 30์ด, 60์ด ๋ฑ |
RFCs | IETF RFC 4226 | RFC 6238 |
๊ฐ๋จํ๊ฒ OTP์ ๋ํด ์์ฑํด๋ณด์์ต๋๋ค. ๊ธฐํ๊ฐ ๋๋ฉด Java์ React๋ก ๊ตฌํํ TOTP์ ๋ํ ๋ด์ฉ๋ ์์ฑํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฐธ๊ณ ๋ฌธํ
https://velog.io/@dldldl1022/OTP%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC
https://www.howdy-mj.me/general/otp