맨위로가기

Bcrypt

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

bcrypt는 블로우피시 암호를 기반으로 설계된 비밀번호 해싱 알고리즘이다. Eksblowfish 키 설정 알고리즘을 핵심으로 사용하며, 비밀번호와 솔트를 결합하여 P-배열과 S-box를 초기화하고 반복적인 키 확장을 통해 보안을 강화한다. bcrypt는 비용(cost) 파라미터를 조절하여 해싱 라운드를 늘릴 수 있어, 무차별 대입 공격에 대한 저항력을 높인다. bcrypt 해시는 알고리즘 식별자, 비용, 솔트, 해시 값으로 구성되며, OpenBSD의 crypt 형식을 따른다. bcrypt는 PBKDF2, scrypt, Argon2와 같은 다른 비밀번호 해싱 알고리즘과 비교되며, 최대 비밀번호 길이 제한 및 해시 잘림과 같은 몇 가지 한계가 있다.

더 읽어볼만한 페이지

  • 암호 소프트웨어 - OpenSSL
    OpenSSL은 1998년에 설립된 암호화 도구 프로젝트로, 다양한 암호화 알고리즘과 프로토콜을 지원하며, 아파치 라이선스를 채택했고, 보안 문제와 API 호환성 문제 등의 비판을 받았다.
  • 암호 소프트웨어 - I2P
    I2P는 2003년 Freenet에서 분기된 익명 P2P 분산 통신 계층으로, IP 주소 노출을 방지하며 다양한 소프트웨어와 익명성 응용 프로그램을 지원하고, 기부금으로 운영되며 6~8주마다 릴리스를 진행한다.
  • 암호학 - 양자 컴퓨터
    양자 컴퓨터는 양자역학적 현상을 이용하여 정보를 처리하는 컴퓨터로, 큐비트를 통해 0과 1을 동시에 표현하여 특정 연산에서 기존 컴퓨터보다 빠른 속도를 보이며 암호 해독, 신약 개발 등 다양한 분야에 혁신을 가져올 것으로 기대된다.
  • 암호학 - 암호화
    암호화는 정보를 보호하기 위해 사용되는 기술로서, 단순한 문자 치환 방식에서 시작하여 현대에는 강력한 암호화 표준과 다양한 종류로 발전했으며, IT 시스템 전반에 적용되지만, 사이버 공격과 양자 컴퓨팅의 발전에 대한 대응이 필요한 기술이다.
Bcrypt
개요
종류패스워드 기반 키 유도 함수
기반 암호블로피시
설계자닐스 프로보스, 데이비드 마지에레스
발표일1999년
다이제스트 크기184비트
라운드 수비용 매개변수를 통해 가변적
상세 정보
유래블로피시 암호
최초 언급OpenBSD CVS 로그 (2014년 3월 23일)
활용
사용 예SUSE crypt() 구현, Elixir, Go, Java, JavaScript, Rust, Zig 등 다양한 언어에서 사용됨

2. 역사적 배경

1999년, 프로보스(Provos)와 마지에르(Mazières)는 USENIX에서 bcrypt를 처음 발표했다.[44] bcrypt는 블로피시 암호의 복잡한 키 설정 단계를 활용하여 설계되었다. 이들은 "Eksblowfish"("expensive key schedule Blowfish", 복잡한 키 스케줄 블로우피쉬)라는 새로운 키 설정 알고리즘을 도입하여 보안을 강화했다.[44]

키 설정은 표준 블로우피쉬 키 설정의 수정된 형태로 시작하며, 여기에서 salt(솔트)와 패스워드(비밀번호) 둘 다 모든 서브키를 설정하는 데 사용된다. 그런 다음 표준 블로우피쉬 키 설정 알고리즘이 적용되는 여러 라운드가 있으며, 각 라운드는 이전 라운드의 서브키 상태에서 시작하여 salt와 패스워드를 번갈아 가며 키로 사용한다. 이론적으로는 표준 블로우피쉬 키 스케줄보다 강하지 않지만, 재키 설정 라운드의 수는 구성 가능하다. 따라서 이 프로세스를 임의로 느리게 만들 수 있으며, 이는 해시 또는 salt에 대한 무차별 대입 공격을 방지하는 데 도움이 된다.[44]

bcrypt의 초기 버전은 `'$2$'`였다. 이후, 문자열 처리 방식을 개선한 `'$2a$'` 버전이 나왔다.[45]

`'$2a$'` 버전에서 문자열은 다음과 같이 처리된다.


  • 문자열은 UTF-8로 인코딩된다.
  • Null 종단이 포함되어야 한다.


2011년 6월에는 BCrypt의 PHP 구현인 '''crypt_blowfish'''에서 8비트 문자열 처리에 관한 버그가 발견되어[46], `'$2x$'`와 `'$2y$'` 버전이 제안되었으나, OpenBSD를 포함한 어떠한 배포판도 채택하지 않았다.

2014년 2월에는 OpenBSD의 bcrypt 구현에서 버그가 발견되었다.[45] 패스워드 길이가 255자를 초과하면 오버플로가 발생하는 문제였다.[47] OpenBSD에서 버그가 발견되었을 때 버전 번호가 갱신되어 `'$2b$'`가 되었다.

3. 알고리즘

Bcrypt 알고리즘은 블로우피시 암호를 기반으로 설계되었으며, 핵심은 "Eksblowfish" 키 설정 알고리즘이다. Eksblowfish는 패스워드솔트를 사용하여 블로우피시의 P-배열과 S-box를 초기화하고, 반복적인 키 확장을 통해 보안을 강화한다.

Bcrypt는 "OrpheanBeholderScryDoubt" 문자열을 블로우피시 암호로 64회 반복 암호화한다. 이때, 일반적인 블로우피시 키 설정 함수 대신 "비용이 많이 드는(expensive key setup)" EksBlowfishSetup 함수를 사용한다.

다음은 bcrypt 알고리즘의 작동 방식을 나타낸 의사 코드(pseudo-code)이다.

```

함수 bcrypt

입력:

cost: 숫자 (4..31). log₂(반복 횟수). 예: 12 ==> 2¹² = 4,096회 반복

salt: 바이트 배열 (16 바이트). 무작위 salt.

password: 바이트 배열 (1..72 바이트). UTF-8 인코딩된 패스워드.

출력:

hash: 바이트 배열 (24 바이트)

// EksBlowfishSetup 함수를 사용하여 블로우피시 상태를 초기화한다.

P, S ← EksBlowfishSetup(cost, salt, password)

// "OrpheanBeholderScryDoubt" 문자열을 64회 반복 암호화한다.

ctext ← "OrpheanBeholderScryDoubt" // 24바이트, 3개의 64비트 블록

반복 (64)

ctext ← EncryptECB(P, S, ctext) // ECB 모드에서 표준 블로우피시 암호화

// 24바이트 ctext가 결과 해시값

반환 Concatenate(cost, salt, ctext)

```

Bcrypt 알고리즘은 블로우피시 암호를 기반으로 하며, Eksblowfish 키 설정을 통해 보안을 강화한다. Eksblowfish는 솔트와 패스워드를 모두 사용하여 서브키를 설정하고, 키 생성 라운드 수를 조절하여 계산량을 늘려 무차별 대입 공격에 대한 저항성을 높인다.

3. 1. Eksblowfish 키 설정

`EksBlowfishSetup` 함수는 bcrypt의 핵심 구성 요소로, 보안 강화를 위한 복잡한 키 설정 과정을 담당한다. 이 함수는 비밀번호와 솔트(salt)를 사용하여 P-배열과 S-box를 초기화하고, 지정된 비용(cost factor)에 따라 `ExpandKey` 함수를 반복 호출하여 키를 확장한다.
EksBlowfishSetup 함수:

```

함수 EksBlowfishSetup

입력:

cost: 숫자 (4..31). log₂(반복 횟수). 예: 12 ==> 2¹² = 4,096 반복

salt: 바이트 배열 (16 바이트). 무작위 salt.

password: 바이트 배열 (1..72 바이트). UTF-8 인코딩된 비밀번호.

출력:

P: UInt32 배열. 18개의 라운드별 서브키 배열.

S₁..S₄: UInt32 배열. 4개의 SBox 배열; 각 SBox는 256개의 UInt32 (즉, 각 SBox는 1 KiB).

// P (서브키)와 S (대체 상자)를 파이의 16진수 숫자로 초기화.

P, S ← InitialState()

// 비밀번호와 salt를 기반으로 P와 S를 순열.

P, S ← ExpandKey(P, S, password, salt)

// 키 설정의 "Expensive" 부분.

반복 (2ᶜᵒˢᵗ)

P, S ← ExpandKey(P, S, password, 0)

P, S ← ExpandKey(P, S, salt, 0)

반환 P, S

```

1. 초기화:

  • `InitialState()` 함수를 호출하여 P-배열과 S-box를 파이(π)의 소수점 이하 자릿수를 16진수로 변환한 값으로 초기화한다. 이는 블로우피시 알고리즘의 초기화 방식과 동일하다.


2. 키 확장 (ExpandKey):

  • `ExpandKey` 함수를 사용하여 비밀번호와 솔트를 P-배열 및 S-box와 혼합한다.
  • `ExpandKey` 함수는 비밀번호와 솔트를 번갈아 사용하며 P-배열과 S-box를 갱신한다.
  • `ExpandKey(P, S, password, salt)`: 비밀번호와 솔트를 모두 사용.
  • `ExpandKey(P, S, password, 0)`: 비밀번호만 사용 (솔트는 0으로 처리).
  • `ExpandKey(P, S, salt, 0)`: 솔트만 사용 (비밀번호는 0으로 처리).


3. 반복:

  • `ExpandKey` 함수 호출을 `2ᶜᵒˢᵗ` 번 반복한다. `cost` 값은 bcrypt 함수에 입력으로 주어지며, 반복 횟수를 결정한다.
  • `cost` 값이 클수록 반복 횟수가 증가하여 키 설정에 더 많은 계산 비용이 소요된다.
  • 각 반복 단계에서 `ExpandKey` 함수는 비밀번호와 솔트를 번갈아 가며 P-배열과 S-box를 갱신한다.

ExpandKey 함수:

```

함수 ExpandKey

입력:

P: UInt32 배열. 18개의 하위 키 배열.

S₁..S₄: UInt32[1024]. 4개의 1KB S-Box.

password: Byte 배열 (1..72 바이트). UTF-8 인코딩된 비밀번호.

salt: Byte[16]. 무작위 salt.

출력:

P: UInt32 배열. 라운드당 18개의 하위 키 배열.

S₁..S₄: UInt32[1024]. 4개의 1KB S-Box.

// 비밀번호를 P 하위 키 배열에 섞음.

for n ← 1 to 18 do

Pₙ ← Pₙ xor password[32(n-1)..32n-1] // 비밀번호를 순환.

// 128비트 salt를 두 개의 64비트 반쪽으로 취급.

saltHalf[0] ← salt[0..63] // salt의 하위 64비트

saltHalf[1] ← salt[64..127] // salt의 상위 64비트

// 모두 0으로 8바이트(64비트) 버퍼 초기화.

block ← 0

// 내부 상태를 P-box에 섞음.

for n ← 1 to 9 do

// 64비트 block을 64비트 salt 반쪽과 XOR.

block ← block xor saltHalf[(n-1) mod 2] // saltHalf[0]과 saltHalf[1] 사이를 번갈아 처리.

// 현재 키 스케줄을 사용하여 block을 암호화.

block ← Encrypt(P, S, block)

P₂ₙ ← block[0..31] // block의 하위 32비트

P₂ₙ₊₁ ← block[32..63] // block의 상위 32비트

// 암호화된 상태를 state의 내부 S-box에 섞음.

for i ← 1 to 4 do

for n ← 0 to 127 do

block ← Encrypt(state, block xor saltHalf[(n-1) mod 2]) // 위와 동일

Sᵢ[2n] ← block[0..31] // 하위 32비트

Sᵢ[2n+1] ← block[32..63] // 상위 32비트

return state

```

`ExpandKey` 함수에서 `ExpandKey(state, 0, key)`는 솔트가 모두 0이므로 일반적인 블로우피시 키 스케줄과 동일하고, `ExpandKey(state, 0, salt)`는 솔트를 128비트 키로 사용한다는 점이 다르다.

결론적으로, `EksBlowfishSetup` 함수는 비밀번호와 솔트를 혼합하고 반복적인 키 확장 과정을 통해 계산 복잡도를 높여 무차별 대입 공격에 대한 보안을 강화한다. 이러한 과정은 프로보스(Provos)와 마지에르(Mazières)가 개발한 "Eksblowfish"(비용이 많이 드는 키 스케줄 블로우피시)의 핵심 아이디어이다.

3. 2. 키 확장 (ExpandKey)

`ExpandKey` 함수는 비밀번호와 솔트를 이용하여 블로우피시 암호의 P-배열과 S-box를 갱신하는 과정을 담당한다.

1. 비밀번호 혼합:

  • 18개의 P-배열 (P1 ... P18) 각 요소에 대해 비밀번호와 배타적 논리합(XOR) 연산을 수행한다.
  • 비밀번호는 32비트 단위로 순환하며 P-배열의 각 요소와 XOR 연산된다.[1]


2. 솔트 기반 암호화 (P-배열 갱신):

  • 128비트 솔트를 두 개의 64비트 (saltHalf[0], saltHalf[1])로 나눈다.
  • 초기값 0으로 설정된 64비트 블록(`block`)을 생성한다.
  • 총 9번 반복:
  • `block`과 `saltHalf`의 값을 번갈아 XOR 연산한다. (`n`이 홀수면 `saltHalf[0]`, 짝수면 `saltHalf[1]`).
  • 현재 P-배열과 S-box를 사용하여 `block`을 암호화한다.
  • 암호화된 `block`의 상위 32비트는 P2n, 하위 32비트는 P2n+1에 저장한다.


3. 솔트 기반 암호화 (S-box 갱신):

  • 4개의 S-box (S1 ... S4) 각각에 대해 다음 과정 반복:
  • 각 S-box는 256개의 32비트 요소를 갖는다.
  • 128번 반복:
  • `block`과 `saltHalf` 값을 번갈아 XOR 연산한다.
  • 현재 P-배열과 S-box를 사용하여 `block`을 암호화한다.
  • 암호화된 `block`의 상위 32비트는 Si[2n], 하위 32비트는 Si[2n+1]에 저장한다.


4. 결과 반환:

  • 갱신된 P-배열과 S-box를 반환한다.[1]


`ExpandKey` 함수에서 솔트가 0인 경우, XOR 연산은 아무런 영향을 주지 않으므로, 일반적인 블로우피시 키 스케줄과 동일하게 동작한다. 비밀번호가 0인 경우에도 마찬가지로 솔트를 128비트 키로 사용하는 것과 유사하게 동작한다.[1]

4. 해시 포맷

bcrypt 해시 문자열은 다음과 같은 형태를 가진다:

`$2b$[비용]$[22자 솔트][31자 해시]`

예시:

`$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy`

위 예시에서 각 부분은 다음을 의미한다.


  • `2a`: 해시 알고리즘 식별자 (bcrypt)
  • `10`: Cost factor (210 ==> 1,024 라운드)
  • `N9qo8uLOickgx2ZMRZoMye`: 16바이트(128비트) 솔트, base64로 인코딩되어 22자
  • `IjZAgcfl7p92ldGxad68LJZdL17lhWy`: 24바이트(192비트) 해시, base64로 인코딩되어 31자


bcrypt의 base-64 인코딩은 `./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789` 테이블을 사용하며,[11] 이는 Base64 인코딩과는 다르다.

bcrypt로 해시된 문자열은 "$2a$", "$2b$" 또는 "$2y$"와 같은 접두사를 가진다. 이 접두사는 해시에 사용된 알고리즘에 따라 다르며, shadow 비밀번호 파일이 Modular Crypt Format이라는 형식으로 작성되어 있고, bcrypt 해시임을 나타낸다.[44] 해시 문자열의 나머지 부분에는 비용 파라미터, 128비트 솔트(Radix-64로 인코딩되어 22자), 184비트 결과 해시 값(Radix-64로 인코딩되어 31자)이 포함된다.[41] Radix-64는 unix/crypt 알파벳을 사용하며, 표준 Base-64와는 다르다.[42][43] 비용 파라미터는 키 확장의 반복 횟수를 설정하며, 2의 거듭제곱 수이며 암호 알고리즘의 입력값이다.

`$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy` 라는 shadow 비밀번호 레코드를 예로 들면, 비용 파라미터는 10 (키 확장 라운드 수는 210), 솔트는 `N9qo8uLOickgx2ZMRZoMye`, 결과 해시는 `IjZAgcfl7p92ldGxad68LJZdL17lhWy`이다. 일반적인 비밀번호 관리 관행에 따라, 사용자의 비밀번호 자체는 저장되지 않는다.

5. 버전별 특징

버전설명비고
`$2bcrypt의 초기 버전. OpenBSD 암호 파일에 사용되는 모듈식 Crypt 형식을 따름.[12]
`$2a문자열 처리 방식(UTF-8 인코딩, null 종결자 포함)을 명확히 정의.[13]
`$2x, `$2ycrypt_blowfish (PHP 구현)에서 발견된 버그(8번째 비트 설정 문자 처리 문제)를 수정.[14]다른 구현에서는 사용되지 않음.
`$2bOpenBSD 구현에서 발견된 버그(긴 비밀번호 처리 문제, 길이 모듈로 256)를 수정.[13][15][16]


6. 다른 비밀번호 해싱 알고리즘과의 비교


  • '''PBKDF2''': PBKDF2는 일반적으로 사용되는 SHA2 해싱 알고리즘을 기반으로 하며, 이는 메모리 하드(memory-hard)하지 않다.[19] SHA2는 가벼운 장치(예: 스마트 카드)에서 실행될 수 있도록 매우 가볍게 설계되었기 때문에, PBKDF2는 비밀번호 저장에 매우 취약하며, 초당 수 조 번의 해시를 수행할 수 있는 상용 SHA-2 해싱 하드웨어를 쉽게 구할 수 있다.[20][21]
  • '''scrypt''': Scrypt는 4MB 미만의 메모리 요구 사항에서 bcrypt보다 약하다.[22] GPU 기반 공격에 대해 동등한 수준의 방어를 달성하려면 bcrypt보다 훨씬 많은 메모리가 필요하다.
  • '''argon2''': Argon2는 약 1000ms 이상의 실행 시간을 넘어서야 bcrypt의 강도와 일치하거나 능가한다. 짧은 실행 시간에서는 bcrypt가 더 안전할 수 있다.[23]

7. 한계 및 비판

Bcrypt는 몇 가지 한계와 비판점을 가지고 있다.

Bcrypt는 최대 72바이트 길이의 비밀번호를 지원하는데, 이는 `ExpandKey` 함수의 비밀번호 처리 방식 때문이다.[1] 72바이트를 초과하는 비밀번호는 잘리거나 반복되어 처리될 수 있다. UTF-8 인코딩에서 한 문자가 최대 4바이트를 차지할 수 있으므로, 최악의 경우 18자(72바이트)로 제한될 수 있다.[1]

표준 OpenBSD 구현에서는 24바이트의 암호문을 23바이트로 잘라내는데,[27] 이로 인해 8비트가 손실되며, 그 이유는 명확하지 않다. 또한, bcrypt의 base-64 인코딩은 `./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789` 테이블을 사용하며,[11] 이는 RFC 4648 Base64 인코딩과 다르다.

7. 1. 최대 비밀번호 길이

Bcrypt는 최대 72바이트 길이의 비밀번호를 지원한다. 이는 `ExpandKey` 함수의 비밀번호 처리 방식 때문이다.[1] 72바이트를 초과하는 비밀번호는 잘리거나 반복되어 처리된다.

`ExpandKey` 함수는 18개의 4바이트 하위 키(P)에 비밀번호를 XOR 연산한다.[1]

```

P1..P18 ← P1..P18 xor passwordBytes

```

비밀번호(UTF-8 인코딩)는 72바이트가 될 때까지 반복된다. 예를 들어, 29바이트 길이의 "correct horse battery staple␀" 비밀번호는 다음과 같이 반복된다.[1]

: `correct horse battery staple␀correct horse battery staple␀correct horse ` (72 바이트)

UTF-8 인코딩에서 한 문자가 최대 4바이트를 차지할 수 있으므로, 최악의 경우 18자(72바이트)로 제한될 수 있다.[1]

많은 bcrypt 구현은 OpenBSD 구현을 따라 비밀번호를 처음 72바이트로 자른다.[11]

2024년, Okta, Inc.의 싱글 사인온 서비스에서 사용자 이름 뒤에 비밀번호를 연결하고 bcrypt로 해시하는 방식 때문에, 사용자 이름이 길면 비밀번호가 무시되는 취약점이 발견되었다.[26]

7. 2. 비밀번호 해시 잘림

표준 OpenBSD 구현에서는 24바이트의 암호문을 23바이트로 잘라낸다.[27] 이로 인해 8비트가 손실되며, 그 이유는 명확하지 않다.

7. 3. Base64 인코딩 알파벳

bcrypt의 base-64 인코딩은 `./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789` 테이블을 사용하며,[11] 이는 RFC 4648 Base64 인코딩과 다르다. 표준 OpenBSD 구현에서 사용되는 인코딩은 crypt와 동일한 Base64 알파벳을 사용하며, 이 알파벳은 `./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`이다.[11]

참조

[1] 간행물 A Future-Adaptable Password Scheme https://www.usenix.o[...] USENIX 1999-06-10
[2] 웹사이트 CVS log for src/lib/libc/crypt/bcrypt.c http://cvsweb.openbs[...] OpenBSD 2023-05-25
[3] 웹사이트 SUSE Security Announcement: (SUSE-SA:2011:035) https://www.suse.com[...] SUSE 2015-08-20
[4] 웹사이트 Bcrypt Elixir: bcrypt password hashing algorithm for Elixir. https://github.com/r[...] riverrun 2021-09-21
[5] 웹사이트 Package bcrypt https://godoc.org/go[...]
[6] 웹사이트 jBCrypt - strong password hashing for Java http://www.mindrot.o[...] 2017-03-11
[7] 웹사이트 bcrypt - A Java standalone implementation of the bcrypt password hash function https://github.com/p[...] 2018-07-19
[8] 웹사이트 bcryptjs https://www.npmjs.co[...] riverrun 2017-02-07
[9] 웹사이트 rust-bcrypt https://github.com/K[...] Vincent Prouillet 2024-11-08
[10] 웹사이트 zigstd https://github.com/z[...] jedisct1 2020-10-26
[11] 웹사이트 bcrypt.c source code, lines 57-58 https://cvsweb.openb[...] 2022-01-29
[12] 웹사이트 Modular Crypt Format — Passlib v1.7.1 Documentation https://passlib.read[...]
[13] 웹사이트 bcrypt password hash bugs fixed, version changes and consequences http://undeadly.org/[...]
[14] 웹사이트 oss-sec: CVE request: crypt_blowfish 8-bit character mishandling http://seclists.org/[...]
[15] 웹사이트 'bcrypt version changes' - MARC http://marc.info/?l=[...]
[16] 웹사이트 bcrypt.c code fix for 2014 bug https://cvsweb.openb[...] 2022-02-17
[17] 논문 Fast Software Encryption, Description of a New Variable-Length Key, 64-Bit Block Cipher (Blowfish) https://www.schneier[...] Springer-Verlag 1993-12
[18] 웹사이트 jBCrypt security advisory http://www.mindrot.o[...] 2010-02-01
[19] 문서 Secure Hash Standard https://csrc.nist.go[...]
[20] 웹사이트 Goldshell KD6 profitability | ASIC Miner Value https://www.asicmine[...]
[21] 웹사이트 Goldshell KD6 Profitability https://www.minerasi[...]
[22] 웹사이트 Why I Don't Recommend Scrypt https://blog.ircmaxe[...] 2014-03-12
[23] 웹사이트 Argon2 vs bcrypt vs. scrypt: which hashing algorithm is right for you? https://stytch.com/b[...] 2023-03
[24] 웹사이트 OWASP Password Storage Cheat Sheet https://cheatsheetse[...]
[25] 웹사이트 Product Specifications https://ark.intel.co[...]
[26] 웹사이트 Why the long name? Okta discloses auth bypass bug affecting 52-character usernames https://www.theregis[...] 2024-11-05
[27] 웹사이트 src/lib/libc/crypt/bcrypt.c at master · openbsd/src https://github.com/o[...] 2024-12-03
[28] 문서 bcrypt file encryption program homepage http://bcrypt.source[...]
[29] 웹사이트 bcrypt APK for Android - free download on Droid Informer https://droidinforme[...]
[30] 웹사이트 T2 package - trunk - bcrypt - A utility to encrypt files. http://t2sde.org/pac[...]
[31] 웹사이트 Oracle GoldenGateのライセンス https://docs.oracle.[...]
[32] 간행물 A Future-Adaptable Password Scheme http://www.usenix.or[...]
[33] 웹사이트 Commit of first work to repo //cvsweb.openbsd.org[...] 2021-01-29
[34] 웹사이트 SUSE Security Announcement: (SUSE-SA:2011:035) https://www.suse.com[...] 2015-08-20
[35] 웹사이트 Package bcrypt https://godoc.org/go[...] 2020-01-29
[36] 웹사이트 jBCrypt - strong password hashing for Java http://www.mindrot.o[...] 2017-03-11
[37] 웹사이트 bcrypt - A Java standalone implementation of the bcrypt password hash function https://github.com/p[...] 2018-07-19
[38] 웹사이트 bcrypt https://www.npmjs.co[...] 2021-01-29
[39] 웹사이트 Bcrypt Elixir: Bcrypt password hashing algorithm for Elixir. https://github.com/r[...] riverrun 2021-01-29
[40] 웹사이트 bcrypt: Modern password hashing for your software and your servers https://github.com/p[...] 2021-01-29
[41] 문서 passlib. https://passlib.read[...]
[42] 웹사이트 Python bcrypt - Modern password hashing for your software and your servers https://github.com/p[...] 2020-01-29
[43] 웹사이트 Bouncy Castle Java Distribution - BCrypt implememntation https://github.com/b[...] 2021-01-29
[44] 웹사이트 Modular Crypt Format — Passlib v1.7.1 Documentation https://passlib.read[...] Assurance Technologies, LLC. 2021-01-29
[45] 웹사이트 bcrypt password hash bugs fixed, version changes and consequences http://undeadly.org/[...] 2021-01-29
[46] 웹사이트 oss-sec: CVE request: crypt_blowfish 8-bit character mishandling http://seclists.org/[...] 2021-01-29
[47] 웹사이트 "'bcrypt version changes' - MARC" http://marc.info/?l=[...] 2021-01-29
[48] 저널 Fast Software Encryption, Description of a New Variable-Length Key, 64-Bit Block Cipher (Blowfish) https://www.schneier[...] Springer-Verlag
[49] 웹사이트 jBCrypt security advisory http://www.mindrot.o[...] 2010-02-01
[50] URL bcrypt file encryption program homepage http://bcrypt.source[...]
[51] URL http://bcrypt463065.[...]
[52] URL http://www.t2-projec[...]
[53] URL https://docs.oracle.[...]
[54] 저널 A Future-Adaptable Password Scheme http://www.usenix.or[...]
[55] 웹인용 Commit of first work to repo "//cvsweb.openbsd.or[...] 1997-02-13
[56] 웹인용 SUSE Security Announcement: (SUSE-SA:2011:035) https://www.suse.com[...] 2011-08-23
[57] 웹인용 Bcrypt Elixir: bcrypt password hashing algorithm for Elixir. https://github.com/r[...] riverrun
[58] 웹인용 Package bcrypt https://godoc.org/go[...]
[59] 웹인용 jBCrypt - strong password hashing for Java http://www.mindrot.o[...] 2017-03-11
[60] 웹인용 bcrypt - A Java standalone implementation of the bcrypt password hash function https://github.com/p[...] 2018-07-19
[61] 웹인용 bcryptjs https://www.npmjs.co[...]
[62] 웹인용 bcrypt: Modern password hashing for your software and your servers https://github.com/p[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com