SHA512 대 복어 및 Bcrypt [폐쇄]


222

해싱 알고리즘을보고 있는데 답을 찾을 수 없습니다.

  • Bcrypt는 복어를 사용합니다
  • 복어는 MD5보다 낫다
  • Q : 그러나 SHA512보다 Blowfish가 더 낫습니까?

감사..

최신 정보:

해싱과 암호화의 차이점을 이해하고 있음을 분명히하고 싶습니다. 무엇이이 방법은 질문 물어 저를 묻는 메시지가 이 문서 , 저자는 "적응 해시"로 bcrypt을 말한다

bcrypt는 Blowfish를 기반으로하기 때문에 Blowfish는 해싱 알고리즘이라고 생각하게되었습니다. 답변이 지적한대로 암호화 된 경우이 기사에서 자리를 차지해서는 안되는 것처럼 보입니다. 더 나쁜 것은 그가 bcrypt가 최고라는 결론을 내린다는 것입니다. 또한 나를 혼란스럽게하는 것은 phpass 클래스 (암호 해시에 사용됨)가 bcrypt (즉, 복어, 즉 암호화)를 사용한다는 것입니다. 이 새로운 정보를 바탕으로 (Blowfish는 암호화 임)이 클래스가 잘못 들립니다. 뭔가 빠졌습니까?


2
잘못이 아닙니다. bcrypt의 작동 방식과 해시 기반 "일방 통행"알고리즘과 동일한 용도로 사용되는 이유에 대한 설명은 내 답변에 대한 업데이트를 참조하십시오.
erickson

3
bcrypt기본적으로 "작업 요소"가 더 높습니다. passhash9를 사용하지 않는 한 SHA는 ...이 아닌 것으로 가정합니다. 왜이 질문이 끝났습니까? 대답은 아직 멀지 만 매우 중요합니다.

1
문제의 링크가 다운되었습니다.
Pacerier

답변:


320

bcrypt 또는 SHA-512 (PBKDF2와 같은 적절한 알고리즘의 맥락에서)가 충분한 지 말하기 만하면 충분 합니다. 그리고 대답은 그렇습니다. 두 알고리즘 모두 암호화 분석이 아닌 구현 결함을 통해 위반이 발생할 수있을 정도로 안전합니다.

어떤 것이 "더 나은지"알기를 고집한다면, SHA-512는 NIST와 다른 사람들에 의해 심층적 인 리뷰를 받았습니다. 좋지만, 지금은 이용할 수 없지만 새로운 해시 알고리즘에 대한 SHA-3 경쟁으로 이어진 결함이 인식되었습니다. 또한 해시 알고리즘에 대한 연구는 암호에 대한 연구보다 "최신"이며 암호 전문가는 여전히 이에 대해 배우고 있습니다.

전체적으로 bcrypt가 Blowfish 자체만큼 많이 조사되지는 않았지만 잘 이해 된 구조의 암호를 기반으로하는 것은 해시 기반 인증이 부족한 고유 한 보안을 제공한다고 생각합니다. 또한 SHA-2 기반 해시 공격 도구로 일반 GPU를 사용하는 것이 더 쉽습니다. 메모리 요구 사항으로 인해 bcrypt를 최적화하려면 온보드 RAM이있는 FPGA와 같은보다 전문화 된 하드웨어가 필요합니다.


참고 : bcrypt는 Blowfish를 내부적으로 사용하는 알고리즘입니다. 암호화 알고리즘 자체는 아닙니다. 해시 함수를 사용하여 "단방향 해시"를 수행하는 것처럼 암호를 돌이킬 수 없게 숨기는 데 사용됩니다.

암호화 해시 알고리즘은 되돌릴 수 없도록 설계되었습니다. 다시 말해, 해시 함수의 출력 만 주어지면 동일한 해시 출력을 생성하는 메시지를 찾기 위해 "영원히"소요되어야합니다. 사실, 동일한 해시 값을 생성하는 두 개의 메시지를 찾는 것은 계산 상 불가능합니다. 암호와 달리 해시 함수는 키로 매개 변수화되지 않습니다. 동일한 입력은 항상 동일한 출력을 생성합니다.

누군가가 비밀번호 테이블에 저장된 값으로 해시되는 비밀번호를 제공하면 인증됩니다. 특히, 해시 함수의 되돌릴 수 없기 때문에 사용자는 해시를 잡고 공격자가 작동 암호를 찾기 위해이를 뒤집은 공격자가 아니라고 가정합니다.

이제 bcrypt를 고려하십시오. 암호에서 "파생 된"키를 사용하여 Blowfish를 사용하여 매직 문자열을 암호화합니다. 나중에 사용자가 비밀번호를 입력하면 키가 다시 파생되고 해당 키로 암호화하여 생성 된 암호문이 저장된 암호문과 일치하면 사용자가 인증됩니다. 암호문은 "암호"테이블에 저장되지만 파생 키는 저장되지 않습니다.

여기에서 암호화를 해제하려면 공격자가 암호문에서 키를 복구해야합니다. 이 공격은 "알려진 평문"공격이라고합니다. 공격은 암호화 된 매직 문자열을 알고 있지만 사용 된 키는 알고 있지 않기 때문입니다. 복어는 광범위하게 연구되었으며 공격자가 알려진 단일 텍스트로 키를 찾을 수있는 공격은 아직 알려져 있지 않습니다.

따라서 돌이킬 수없는 알고리즘 기반의 암호화 요약과 마찬가지로, bcrypt는 암호, 소금 및 비용 요소로부터 돌이킬 수없는 출력을 생성합니다. 그것의 장점은 알려진 평문 공격에 대한 Blowfish의 저항에 있으며 이는 다이제스트 알고리즘에 대한 "첫 번째 사전 이미지 공격"과 유사합니다. 암호를 보호하기 위해 해시 알고리즘 대신 사용할 수 있기 때문에 bcrypt를 혼동하여 "해시"알고리즘 자체라고합니다.

소금을 올바르게 사용하여 레인보우 테이블을 방해했다고 가정하면 진정으로 돌이킬 수없는 기능은 공격자가 시행 착오를 줄입니다. 공격자가 시험을 수행 할 수있는 속도는 돌이킬 수없는 "해시"알고리즘의 속도에 따라 결정됩니다. 해시 함수의 단일 반복을 사용하는 경우 공격자는 $ 1000 정도의 비용이 드는 장비를 사용하여 초당 수백만 건의 시험을 수행 할 수 있으며 몇 개월 동안 최대 8 자 길이의 모든 비밀번호를 테스트 할 수 있습니다.

그러나 다이제스트 출력이 수천 번 "피드백"되면 해당 하드웨어에서 동일한 암호 집합을 테스트하는 데 수백 년이 걸립니다. Bcrypt는 키 파생 루틴 내에서 반복하여 동일한 "키 강화"효과를 달성하며 PBKDF2와 같은 적절한 해시 기반 방법도 동일한 기능을 수행합니다. 이와 관련하여 두 가지 방법이 비슷합니다.

따라서 bcrypt에 대한 권장 사항은 1) Blowfish가 SHA-2 해시 함수 제품군과 비슷한 수준의 조사를 받았으며 2) 암호에 대한 암호화 분석 방법이 해시 기능에 대한 암호화 방법보다 더 잘 개발되었다는 가정에서 비롯됩니다.


4
좋은 소식 +1 그러나 두 가지 질문이 있습니다. 복어는 10 년 전에 두 물고기로 대체되었는데, 시스템이 현대의 원시 요소를 활용해서는 안됩니까? 또한 많은 사람들이 특정 순간에 로그인하는 웹 애플리케이션과 같은 시스템에서 수천 번의 반복이 낭비되는 것처럼 보입니다. 예를 들어 PBKDF2는 암호화 된 파일 시스템의 string2key 함수와 같이 한 번에 한 사람이 로그온하는 시나리오에서만 구현됩니다. 나는 "공격자가 들어 올리기에 너무 무겁다면 서버에 너무 무겁다"라는 속담을 사용합니다. 어떻게 생각해?
rook

17
더 현대적인 프리미티브를 사용하는 데 문제가 있다고 생각하지 않습니다. 취약점은 종종 시간이 지남에 따라 발견되며 Twofish는 Blowfish에서 얻은 지식을 사용하여 개발되었습니다. 그러나 Blowfish의 사용을 무효화 할 수있는 특정 취약점에 대해서는 잘 모릅니다. 따라서 "파산 한 경우"에 대한 주장도 가능합니다. 공격자에 대한 당신의 속담은 나에게 좋지 않습니다. 침입자가 10 억 개의 암호를 테스트하는 데 몇 년이 걸리는 알고리즘을 선택하더라도 합법적 인 응용 프로그램에서 무시할 수있는 시간을 소비하게됩니다.
erickson

15
해시 함수의 사양을 보면 "salt"에 대한 내용이 표시되지 않습니다. 유일한 매개 변수는 요약 할 메시지입니다. 암호의 사양을 검토하면 키로 함수가 매개 변수화되어 있음을 알 수 있습니다. 해시와 함께 사용 되거나 사용 되지 않을 수있는 "소금" 은 단순히 메시지의 일부입니다. 해시 알고리즘은이를 필요로하지 않으며, 특별히 처리하지 않으며, 나머지 메시지와 구별 할 수 없습니다. 따라서 메시지가 솔트에 의해 종종 변경 되는 것이 사실 이지만, 주어진 메시지는 단 하나의 해시 만 생성합니다.
erickson

1
@Andre D 펜 테스터로서 계정을 잠그는 응용 프로그램과 무차별 대입을 막지 않는 응용 프로그램을보고합니다. 이상적으로 잘못된 IP 주소는 보안 문자를 해결해야하며, 추가로 사용자 이름이 대상인 경우 (사용자 이름이 존재하지 않더라도) 인증하기 전에 해당 계정이 보안 문자를 해결해야합니다. 분당 X의 속도 제한을 적용하는 것도 허용됩니다. 관련 : security.stackexchange.com/questions/25444/…
루크

2
@rook : 속도 제한 응용 프로그램을 사용하는 것이 좋지만이 경우 데이터베이스가 다운로드되어 설명하는 속도 제한이없는 장비에 배치되었다고 가정 할 수 있습니다.
Ellert van Koperen

50

암호 인증의 경우 bcrypt가 SHA-512 의 단일 반복 보다 훨씬 낫습니다. 단순히 느리기 때문입니다. 이 특정 게임에서 왜 속도 저하가 유리한지 모르겠다면, 다시 연결 한 기사를 읽으십시오 ( " 비밀번호 해시 기능에서 원하지 않는 속도입니다 "로 스크롤하십시오 ).

PHK의 MD5 알고리즘이 작동하는 방식과 마찬가지로 SHA-512 주변에서 안전한 암호 해싱 알고리즘을 수천 번 반복하여 작성할 수 있습니다. Ulrich Drepper는 glibc의 crypt ()에 대해 정확하게 이것을했습니다 . 그러나 이미 테스트 된 bcrypt 구현을 사용할 수있는 경우에는 특별한 이유가 없습니다.


3
내 대답은 단일 해시 반복이 충분하지 않다는 것을 분명히합니다. "해시 함수의 단일 반복을 사용하는 경우 공격자는 $ 1000 정도의 비용으로 장비를 사용하여 초당 수백만 건의 시험을 수행 할 수 있으며, 몇 개월 동안 최대 8 자 길이의 모든 비밀번호를 테스트 할 수 있습니다. 그러나 다이제스트 출력 수천 번 '피드백'된 경우 해당 하드웨어에서 동일한 암호 세트를 테스트하는 데 수백 년이 걸릴 것입니다. Bcrypt는 반복하여 동일한 '키 강화'효과를 달성합니다… "
erickson

@ erickson : 네, lede를 거기에 묻었을 것입니다. 내가하려고했던 요점은 bcrypt와 SHA-512의 직접적인 비교는 실제로 관련이 없다는 것입니다. 하나는 키 파생 함수이고 다른 하나는 자체적으로 부적합한 암호화 기본 요소이기 때문입니다.
caf


1
수천 번의 SHA-512를 사용하는 것은 들어 본 적이 없으며 다양한 crypt구현 (내가 사용하는 PHP 포함)에 포함되어 있기 때문에 원래 질문을 읽었을 때 OP가 SHA-512에 대해 질문했을 때 OP가 의미 한 것으로 가정했습니다. 그는 실제로 수백 또는 수천 개의 반복 자체를 사용하는 수천 라운드의 SHA-512 vs bcrypt를 언급하고 있습니다.
thomasrutter

33

복어는 해싱 알고리즘이 아닙니다. 암호화 알고리즘입니다. 즉 복어를 사용하여 무언가를 암호화 한 다음 나중에 일반 텍스트로 해독 할 수 있습니다.

SHA512는 해싱 알고리즘입니다. 즉, 이론적으로 입력을 해시하면 원래 입력을 다시 가져올 수 없습니다.

그것들은 서로 다른 작업에 사용하도록 설계된 2 가지입니다. "SHA512보다 복어가 더 낫습니까?"에 대한 '올바른'대답은 없습니다. 당신은뿐만 아니라 요청할 수도 "사과가 더 나은 캥거루보다?"

주제에 대한 자세한 내용을 보려면 다음 링크를 참조하십시오.


18
해싱이 그 목적으로 사용되는 것처럼 bcrypt를 암호에 대한 돌이킬 수없는 보호로 사용하는 것이 문제라고 생각합니다.
erickson

3
@erickson 텍스트 "Q : SHA512보다 Blowfish가 더 낫습니까?" 나에게 분명해 보이고 OP가 두 알고리즘의 차이점을 이해하지 못한다는 것을 보여줍니다.
Glen

1
여기 OP 실제로, 복어가 암호화 알고리즘이라는 글렌의 대답을 바탕으로 (해시와는 다른 것으로 이해합니다) 예, 제 질문이 혼란 스럽습니다. 지금 혼동되는 것은 phpass 클래스 (암호 해시에 사용됨)가 bcrypt (즉, 복어, 즉 암호화)를 사용한다는 것입니다. 복어가 암호화라면 phpass가 암호를 해시하는 데 어떻게 사용합니까? 뭔가 빠졌습니까?
Chris

2
그러나 어떤 사과와 캥거루가 특정 작업에 더 적합한 지 묻습니다. 복어는 해시에 걸리는 시간 때문에 sha보다 더 나은 해싱 기능입니다. 내가 본 sha의 대부분의 구현은 매우 빠릅니다. 암호 해싱을위한 느린 알고리즘이 필요합니다.
John Nicholas

이 답변은 Blowfish가 암호화 알고리즘이라는 것이 맞지만,이 문맥에서 (예를 들어에서 사용될 때 bcrypt) 소스 문자열에서 키를 도출하고이를 사용하여 매직 넘버를 암호화함으로써 해싱 알고리즘으로 사용됩니다. 이것은 본질적으로 해싱 함수로 되돌릴 수 없게 만듭니다. 일반 텍스트 및 암호화 된 데이터를 알고 있어도 암호에서 키를 계산할 수 없습니다.
thomasrutter

4

복어는 다른 용도로 사용되므로 MD5 또는 SHA512보다 낫지 않습니다. MD5와 SHA512는 해싱 알고리즘이고 Blowfish는 암호화 알고리즘입니다. 완전히 다른 두 가지 암호화 기능.


2

Ulrich Drepper의 SHA-256 / SHA-512 기반 암호화 구현을 권장합니다.

이 알고리즘을 Java로 포팅했으며 ftp://ftp.arlut.utexas.edu/java_hashes/ 에서 무료 라이센스 버전을 찾을 수 있습니다 .

가장 현대적인 (L) Unices는 / etc / shadow 파일에서 Drepper의 알고리즘을 지원합니다.


PWDTK sourceforge.net/projects/pwdtknet 은 HMAC-SHA512를 사용하지만 여기에서 다른 사람들이 말한 것처럼 키 느리게하는 "느림"을 만들기 위해 많은 반복 작업을 수행합니다. BCrypt는 언급 한 것처럼 단일 SHA-512보다 낫지 만 PBKDF2와 같은 방식으로 SHA-512를 사용하면 안전합니다 (큰 암호 랜덤 소금을 사용하고 시간을 강제하기에 충분한 반복을 사용하는 한) 레인보우 테이블 만들기) 방금 게시 한 API가 저에 의해 작성되었으며 .NET에서 원하는 것을 수행 할 것입니다 (이후 독자를 위해)
thashiznets

2

방금 이걸 보았습니다.

http://codahale.com/how-to-safely-store-a-password/

이 기사의 저자가 틀릴 수 있습니까?


2
그가 틀린 것이 아니라 해시 알고리즘을 적용하는 방법에 대한 많은 문헌을 무시하고 있다는 것입니다. bcrypt와 마찬가지로 키 파생 함수에서 반복적으로 사용해야합니다.
erickson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.