로그인 시스템을 처음 출하했을 때, 나는 그 시대의 모든 튜토리얼이 나에게 하라고 말한 것을했습니다: 저장 md5($password) 사용자 테이블에서 이동하고. 그것은 작동,조용히 재앙이었다. 나중에 워드 프레스 플러그인과 Laravel 애플 리케이션에 auth 를 구축의 년,나는 "암호 확인 pass"과 "이 데이터베이스가 유출하는 경우 암호는 안전합니다." Bcrypt 는 그 격차의 대부분을 닫는 도구이며,내가 도달하는 거의 모든 프레임 워크의 기본값입니다. 그래서 나는 구축 a bcrypt 생성기 에 Toolz.dev 즉, 당신이 제어 비용 요소와 암호를 해시, 기존 해시에 대한 암호를 확인하고, 당신이 입력 아무것도 이제까지 아무데도 전송되지 않도록 브라우저에서 모든 작업을 수행합니다. 이것은 그것에 대한 가이드와 bcrypt 자체에.
TL;DR: Bcrypt 는 암호를 염장되고 의도적으로 느린 60 자 해시로 바꾸어 유출 된 데이터베이스가 유출 된 암호 목록이 아닙니다. The Toolz bcrypt 생성기 비용 요소 (4 ~ 31) 가 조정 가능한 암호를 해시하고, 붙여넣은 해시에 대해 암호를 확인하고, 구문 분석한 버전, 비용 및 솔트를 표시합니다. 이 표준은 표준을 생성합니다
$2b$openbsd, PHP 형식을 지정합니다password_hash, Laravel 및 Node bcrypt 라이브러리는 모두 허용되며 완전히 클라이언트 측에서 실행됩니다.
bcrypt 란 무엇입니까?
Bcrypt는 Niels Provos와 David Mazieres가 설계하고 1999년 USENIX 논문에 제시된 비밀번호 해싱 기능입니다 "미래에 적응할 수 있는 비밀번호 체계 및 견적;. 그것은 복어 블록 암호에 내장되어 있지만, 트위스트: 대신 데이터를 암호화, 그것은 복어 & #39;s 키 설정 단계를 반복 실행, 키 자료로 암호와 임의의 소금을 사용하여 결과는 한 번 계산하는 데 저렴하고 정확하게 속성 암호 저장 요구 억 번 계산하는 데 비싼 일방적 해시입니다.
That "experty" idea is the heart of it. SHA-256 과 같은 범용 해시는 빠른 속도로 설계되었습니다. 왜냐하면 체크섬과 무결성 검사는 속도를 원하기 때문입니다. 암호 해싱은 그 반대를 원합니다. 공격자가 데이터베이스를 훔친다면,그들과 모든 일반 텍스트 암호 사이에 서있는 유일한 것은 추측하는 데 걸리는 시간입니다. 빠른 해시는 현대 GPU 가 초당 수십억 명의 후보자를 테스트하도록합니다; 코어 당 초당 수천 개의 합리적인 비용 상한선에서 bcrypt 해시. 동일한 유출 된 파일,매우 다른 결과.
Bcrypt 는 기본 사항을 올바르게 적용하고 적응할 수 있기 때문에 20 년 이상 살아 남았습니다. 비용 요소는 1999 하드웨어에 맞게 조정 된 동일한 알고리즘이 다른 것을 변경하지 않고도 2026 하드웨어에 전화를 걸 수 있음을 의미합니다. 그것은 여전히 권장 옵션에서 OWASP 암호 저장 속임수 장그리고,Laravel, Spring Security,그리고 제가 일하는 다른 많은 스택의 기본값입니다. 이 작업에 대해 빠른 해시가 잘못된 이유에 대한 더 깊은 배경을 원한다면,the 데이터 개인 정보 보호 온라인 도구 가이드는 업계 전체를 느리고 소금에 절인 해싱으로 몰아넣은 추론을 다루고 있습니다.
bcrypt 해시에는 무엇이 포함되어 있습니까?
bcrypt 에 대한 가장 좋은 점 중 하나는 출력이 자기 설명적이라는 것입니다. 실제 해시를 가져 가라:
$2b$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW
읽기 왼쪽에서 오른쪽으로, 달러 기호에 분할, 그리고 그것에 대해 암호를 확인하는 데 필요한 모든 것을 알려줍니다:
| 필드 | 예 | 의미 |
|---|---|---|
| 버전 | 2b |
bcrypt 변형입니다. 2b 현재 수정된 OpenBSD 형식입니다 |
| 비용 | 12 |
작업 요소. 키 설정은 2^12 = 4096 반복을 실행합니다 |
| 소금 | R9h/cIPz0gi.URNNX3kh2O |
사용자 정의 Base64 22 자, 16 임의 바이트로 디코딩 |
| 다이제스트 | PST9/PgBkqquzi.Ss7KIUgO2t0jWMUW |
23 바이트 bcrypt 출력을 인코딩하는 31 문자 |
염분과 비용이 문자열 안에 살고 있기 때문에 검증에는 다른 것이 필요하지 않습니다. 해시를 붙여 넣을 때 bcrypt 생성기 확인 모드, 그것은 문자열에서 바로 비용과 소금을 읽고, 그 정확한 소금으로 다이제스트를 다시 계산하고, 비교합니다. 관리 할 별도의 소금 열이 없으며, bcrypt가 저장하기에 매우 즐거운 이유 중 하나입니다: 사용자 테이블의 단일 불투명 필드입니다.
사용자 정의 Base64 알파벳은 사람들을 위로 여행하기 때문에 주목할 가치가 있습니다. Bcrypt는 사용합니다 ./A-Za-z0-9표준 Base64 와는 다른 순서인.bcrypt salt 는 표준 Base64 문자열이 아니므로 일반 Base64 도구로 디코딩하려고 하지 말고 의미 있는 바이트를 기대하십시오. 다른 모든 곳에서 사용되는 표준 변형이 궁금하다면, the base64 인코딩 가이드는 일반 알파벳과 그것이 나타나는 위치를 안내합니다.
bcrypt 해시를 어떻게 생성합니까?
도구에서 그것은 세 단계: 암호를 입력,비용을 선택,생성을 클릭합니다. 후드 아래,해시를 생성하는 것은 보이는 것보다 더 많은 일을. 먼저 암호로 강한 임의의 소금 16 바이트 웹 암호화 API 를 사용하여 생성됩니다. 그런 다음 bcrypt 는 비싼 키 일정을 실행하여 암호와 소금으로 Blowfish 를 시드하고 2^cost 시간을 반복합니다. 마지막으로 그것은 고정 된 마법 문자열을 암호화 ("OrpheanBeholderScryDoubt") 64 번 결과 암호 상태와 Base64-엔코딩 출력. 그 전체 춤은 60 자 해시를 생성합니다.
가장 흔한 놀라움은 같은 암호를 두 번 해싱하면 두 개의 다른 해시가 생긴다는 것입니다. 그것은 정확하고 의도적인 것입니다. 각 해시는 자신의 임의의 솔트를 얻으므로 둘 다 선택하는 두 명의 사용자가 있습니다 hunter2 결국 완전히 다른 저장된 값을 갖게 됩니다. 테이블을 훔친 공격자는 두 계정이 비밀번호를 공유한다는 것을 알 수 없으며 계정 전체에서 미리 계산된 테이블을 재사용할 수 없습니다. 테스트를 위해 특정 해시를 재현하려는 경우 베어 비용이 아닌 전체 솔트 문자열을 공급하게 되는데,이는 바로 검증 모드가 내부적으로 수행하는 작업입니다.
여러분의 응용 프로그램 코드에서는 이 중 어떤 것도 손으로 조립하지 않습니다. 여러분은 라이브러리를 호출합니다:
// PHP
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
// Node with bcrypt / bcryptjs
const hash = await bcrypt.hash(password, 12)
// Laravel
use Illuminate\Support\Facades\Hash;
$hash = Hash::make($password); // bcrypt by default
Toolz 도구는 해당 코드 주변의 순간을 위한 것입니다: 주어진 비용으로 해시가 어떻게 생겼는지 온전하게 확인하거나, 시더 또는 테스트 픽스처에 대해 알려진 해시를 생성하거나, 구성에서 찾은 해시가 비밀번호와 일치하는지 확인합니다. 그렇다고 생각합니다.
비용 요소를 어떻게 선택합니까?
비용 요소는 당신이 생각해야 할 하나의 손잡이이며, 정직한 대답은 & quot;measure, copy."하지 마십시오; OWASP의 경험 법칙은 단일 해시가 생산 하드웨어에서 4 분의 1 초 정도 어딘가에 있어야한다는 것입니다. 그 목표는 두 가지 반대되는 힘의 균형을 유지합니다: 너무 낮고 크래킹을 저렴하게 만들고 너무 높으며 모든 합법적 인 로그인은 가격을 지불하며 바쁜 엔드 포인트가 모든 요청에 해싱 될 때 중요합니다.
비용이 2 의 거듭제곱이기 때문에 각 단계는 작업을 두 배로 늘립니다. 비용 11 은 비용 10 보다 두 배 느리고 비용 12 는 네 배 느립니다. 일반적인 2020 년대 서버 하드웨어에서는 올바른 이웃에 비용 10 ~ 12 랜드가 있기 때문에 프레임 워크가 기본으로 적용됩니다. 이 도구는 슬라이더를 드래그하면서 대략적인 시간 추정치를 보여줌으로써 비용 화합물을 얼마나 빨리 느낄 수 있지만 서버의 벤치 마크가 아닌 상대적인 가이드로 취급합니다. 실제 숫자는 CPU 에 따라 다르며 시간을 알 수있는 유일한 방법입니다 password_hash 실행할 상자에.
알만한 실용적인 패턴 하나: 비용이 모든 해시 안에 저장되기 때문에 마이그레이션 없이 시간이 지남에 따라 비용을 올릴 수 있습니다. 성공적인 로그인 시 잠시 동안 일반 텍스트를 사용할 수 있으므로 저장된 해시's 비용이 현재 목표보다 낮은지 확인하고,그렇다면 재해시 및 업데이트를 통해 PHP 가 이를 직접 노출합니다 password_needs_rehash. 그것은 당신의 안전이 이제까지 암호 리셋을 강제하지 않고 기계설비를 가진 보조를 맞춘다는 것을 의미합니다.
Bcrypt 대 SHA-256, Argon2 및 scrypt
가장 중요한 비교는 일반 빠른 해시와 최신 메모리 하드 기능에 대한 bcrypt입니다. 비밀번호 저장을 위해 정렬하는 방법은 다음과 같습니다:
| 기능 | 소금에 절인 | 일부러 천천히 | 메모리 하드 | 암호에 좋은? |
|---|---|---|---|---|
| MD5 / SHA-256 | 아니 (그 자체로) | 아니요 | 아니요 | 아니요, 너무 빠릅니다 |
| bcrypt | 예, 내장되어 있습니다 | 예, 조정 가능한 비용입니다 | 아니요 | 네, 추천합니다 |
| 스크립트 | 예 | 예 | 예 | 예 |
| 아르곤2id | 예 | 예 | 예 | 예, 새로운 시스템에 선호됩니다 |
암호의 벌거벗은 SHA-256 는,소금에 절인 조차,잘못된 공구이다: 그것은 속도를 위해 디자인된다,그래서 소금에 절인 SHA-256 해시의 유출한 데이타베이스는 GPU 에 빨리 떨어진다. 당신이 체크섬을 위한 빠른 다이제스트 또는 암호 보다는 오히려 캐시 열쇠만 필요로 하는 경우에,저것은 무엇 이다 해시 생성기 를 위한 것이고,구별은 전체적인 요점입니다. 2015 암호 해싱 경쟁의 우승자 인 Argon2id 는 bcrypt 를 가속화 할 수있는 사용자 정의 하드웨어에 저항하는 메모리 경도를 추가하고 런타임을 제어하는 새로운 시스템의 첫 번째 선택입니다. 그러나 bcrypt 는 구식이 아니며,전투 테스트를 거쳤으며,내가 매일 사용하는 도구의 기본값이며,선택은 특히 프레임 워크가 그것을 배송 할 때 건전한 결정입니다. 피해야 할 실수는 & quot;bcrypt 대신 Argon2,& quot; 그것은 & quot; 그들 중 어느 것 대신에 빠른 해시입니다. & quot; 해싱과 페어링하는 보안 유틸리티의 광범위한 투어를 위해,the 개발자 생산성 도구 가이드는 지도를 가지고 있습니다.
72 바이트 제한 및 기타 gotchas 는 어떻습니까?
Bcrypt 는 암호의 처음 72 바이트만 읽습니다. 정상적인 암호를 위해 결코 중요하지 않지만 아주 긴 암호문을 물 수 있는 묵묵히 무시되는 과거의 무엇이든,특히 바이트 수가 문자 수보다 빨리 오르는 멀티 바이트 UTF-8 문자를 가진 도구는 입력이 72 UTF-8 바이트를 교차할 때마다 경고하므로 절단은 결코 침묵하는 놀라움이 아닙니다. 일부 시스템은 임의로 긴 암호를 고정 짧은 입력으로 접는 bcrypt 에 건네주기 전에 SHA-256 및 Base64 인코딩으로 암호를 사전 해싱하여 한계 근처에서 작동합니다; 이렇게하면 가입과 로그인 모두에서 일관되게 수행하십시오.
다른 gotcha 는 버전 접두사입니다. 당신은 볼 것이다 $2a$, $2y$, 그리고 $2b$ 야생에서. $2a$ 원본이었나요 $2y$ 일부 구현에서 부호 확장 버그가 발견된 후 도입된 PHP 관련 태그였습니다 $2b$ 는 현재 수정된 OpenBSD 버전입니다. 원하는 새 해시의 경우 $2b$이 도구가 생성하는 것입니다. 세 가지 모두 일반 ASCII 비밀번호에 대해 동일하게 확인합니다; 차이점은 72바이트 경계 근처의 특정 비ASCII 바이트로만 나타납니다. 구조화된 자격 증명도 검사하는 도구에 토큰을 붙여넣을 때 JWT 디코더, bcrypt 해시는 페이로드를 읽기 위해 디코딩하는 토큰이 아니라는 점을 명심하세요; 공개할 내용이 없는 단방향 다이제스트입니다.
bcrypt 생성기가 실제 워크플로에 맞는 위치입니다
그 자체로 해시는 스토리의 절반에 불과하므로 믹서는 내가 열어 두는 다른 자격 증명 도구와 나란히 놓입니다. 테스트 데이터베이스를 시드하거나 데모 계정을 설정할 때 비밀번호 자체를 생성합니다 암호 생성기, 합리적인 강도 막대를 지우는지 확인하십시오 암호 강도 검사기그리고 나서야 그것을 통해 실행하십시오 bcrypt 생성기 저장된 해시를 얻으려면. 그 순서가 중요합니다: cost-12 bcrypt 해시 뒤에 있는 강력한 무작위 비밀번호는 해독하기 정말 어려운 반면, 동일한 해시 뒤에 있는 약한 비밀번호는 여전히 사전 공격에 속합니다. 왜냐하면 공격자는 전체 키 공간이 아닌 소수의 가능성 있는 후보만 추측하면 되기 때문입니다. 비용 요소는 시간을 벌게 합니다; 비밀번호 엔트로피는 그 시간을 반대하는 것입니다.
확인 모드는 디버깅 중에 그 자리를 차지합니다. 로그인이 스테이지에서 신비롭게 실패하면 문제를 분리하는 가장 빠른 방법은 저장된 해시와 정확하다고 생각되는 비밀번호를 붙여넣고 일치하는지 확인하는 것입니다. 일치란 버그가 업스트림이라는 것을 의미하며 비밀번호가 검사에 도달하는 방식; 불일치는 저장된 해시가 다른 비밀번호나 엉망인 인코딩으로 작성되었음을 의미합니다. 어느 대답이든 추측을 방해하고 모든 것이 로컬로 실행되기 때문에 해시가 기계를 떠나지 않고도 데이터베이스에서 가져온 실제 해시로 이를 수행할 수 있습니다. 이는 사이트의 모든 도구 뒤에 있는 동일한 클라이언트 측 원칙이며 자격 증명을 건드리는 모든 경우에는 까다롭지 않습니다. 요구 사항입니다.
자주 묻는 질문
이 bcrypt 생성기에 실제 암호를 해시하는 것이 안전합니까?
예,해싱은 브라우저에서 완전히 발생하고 아무 것도 아무데도 전송되지 않기 때문입니다. 개발자 도구의 네트워크 탭에서 이를 확인할 수 있습니다: 해시를 생성하면 요청이 없습니다. 즉,브라우저 탭은 암호 관리자가 아니므로 빌드하지 않은 웹 페이지에 프로덕션 계정의 라이브 자격 증명을 붙여 넣지 말고 완료되면 탭을 닫으십시오.
왜 같은 암호가 매번 다른 bcrypt 해시를 생성합니까?
bcrypt 는 모든 해시에 대해 새로운 랜덤 솔트를 생성하고 그 결과에 혼합하기 때문입니다. 이것은 기능입니다: 동일한 암호를 선택한 두 사용자는 여전히 다른 저장된 해시를 얻으므로 공격자는 공유 암호를 발견하거나 미리 계산 된 테이블을 재사용 할 수 없습니다. 솔트가 해시 문자열 자체 내부에 저장되기 때문에 확인은 여전히 작동합니다.
bcrypt에는 어떤 비용 요소를 사용해야 합니까?
로그인 흐름이 귀찮은 지연없이 견딜 수있는 가장 높은 비용을 사용하십시오, 이는 대부분의 2020 년대 서버에 대한 비용 10 에 12 입니다. OWASP는 단일 해시가 프로덕션 하드웨어에서 대략 4 분의 1 초를 차지해야한다고 제안합니다. 각 단계가 작업을 두 배로하기 때문에 숫자를 복사하는 대신 자체 서버에서 측정하고 하드웨어 속도가 빨라지면 몇 년마다 비용을 인상하십시오.
bcrypt 해시를 다시 비밀번호로 되돌릴 수 있나요?
아니요. Bcrypt 는 단방향 함수이므로 해시를 원래 암호로 다시 바꾸는 수학적 방법은 없습니다. 유일한 공격은 추측입니다: 공격자는 동일한 솔트와 비용으로 후보 암호를 해시하고 일치 여부를 확인합니다. 그렇기 때문에 비용 요소가 중요합니다. 각 추측의 비용이 얼마나 비싼지 설정하고 강력한 고유 암호와 높은 비용이 추측을 비실용적으로 만드는 이유입니다.
2026 년에도 bcrypt 는 여전히 안전한가요,아니면 Argon2 로 전환해야 하나요?
Bcrypt 는 여전히 암호 저장에 안전한 것으로 간주되며 OWASP 암호 저장 속임수 시트에서 권장되는 옵션으로 남아 있습니다. 2015 암호 해싱 대회의 우승자 인 Argon2id 는 GPU 및 특수 하드웨어 공격에도 저항하기 때문에 런타임을 제어하는 새로운 시스템에 선호됩니다. Bcrypt 는 특히 프레임 워크가 기본값으로 제공 할 때 건전한 선택입니다; 실제 실수는 암호 해싱 기능 대신 빠른 범용 해시를 사용하는 것입니다.
bcrypt 에서 72 바이트 제한은 무엇입니까?
Bcrypt 는 UTF-8 인코딩 된 암호의 처음 72 바이트 만 읽으므로 그 이상의 문자는 무시됩니다. 일반 암호의 경우 이것은 결코 중요하지 않지만 매우 긴 암호 문구를 잘릴 수 있으므로 일부 시스템은 암호를 미리 해시합니다. SHA-256 bcrypt 전에. 이 도구는 입력이 72 바이트를 초과 할 때마다 경고하므로 잘림은 결코 놀라운 일이 아닙니다.
$2a$, $2b$, $2y$ 접두사는 무엇을 의미하나요?
그들은 bcrypt 출력 형식을위한 버전 태그입니다. $2a $는 원본이었고 $2y $는 부호 확장 버그에 대한 PHP 전용 수정이었고 $2b $는 현재 수정 된 OpenBSD 버전입니다. 새로운 해시의 경우 $2b $가 정확하며이 도구가 생산하는 세 가지 모두 ASCII 암호에 대해 동일하게 확인합니다; 차이점은 72 바이트 경계에서 특정 비 ASCII 바이트에만 나타납니다.
bcrypt 는 암호화와 동일한가?
아니요. 암호화는 키로 되돌릴 수 있으므로 암호화된 데이터는 원본으로 다시 해독할 수 있습니다. Bcrypt 해싱은 일방적이고 의도적으로 느리며 확인 전용입니다: 암호를 복구할 필요가 없으며 누군가가 올바른 것을 입력했는지 확인하기 위해서만 해싱 대신 암호화로 암호를 저장하는 것은 안티 패턴입니다. 키를 보유한 사람이 모든 암호를 복구할 수 있기 때문입니다.



