이 흥미로운 질문을 읽은 후 , 내가 필요하다면 어떤 안전하지 않은 해싱 알고리즘을 사용해야하는지에 대한 좋은 생각이 들었지만, 대신 안전한 알고리즘을 사용해야하는 이유는 모르겠습니다.
그렇다면 차이점은 무엇입니까? 출력은 해시 된 것을 나타내는 임의의 숫자가 아닙니까? 해싱 알고리즘을 안전하게 만드는 이유는 무엇입니까?
이 흥미로운 질문을 읽은 후 , 내가 필요하다면 어떤 안전하지 않은 해싱 알고리즘을 사용해야하는지에 대한 좋은 생각이 들었지만, 대신 안전한 알고리즘을 사용해야하는 이유는 모르겠습니다.
그렇다면 차이점은 무엇입니까? 출력은 해시 된 것을 나타내는 임의의 숫자가 아닙니까? 해싱 알고리즘을 안전하게 만드는 이유는 무엇입니까?
답변:
모든 암호화 해시 함수에서 원하는 세 가지 속성이 있습니다 H
.
사전 이미지 저항 : 주어진 h
값을 찾기가 어렵 x
습니다 h = H(x)
.
두 번째 사전 이미지 저항 : 주어진 x1
, 찾기 힘들 것 x2 != x1
입니다 H(x1) = H(x2)
.
충돌 저항 :로 두 값을 찾기가 어렵 x1 != x2
습니다 H(x1) = H(x2)
.
해시 테이블 (문자열)에 대한 공통 프로그래밍 언어에서 사용되는 해시 함수를 사용하면 대개 다음 중 하나만 제공되지 않습니다.
위의 세 가지 속성은 모든 암호화 해시 함수의 디자인 목표입니다. MD4, SHA-0, MD5와 같은 일부 기능의 경우이 기능이 (적어도 부분적으로) 실패한 것으로 알려져 있습니다. 현재 세대 (SHA-2)는 안전하다고 가정하고, 다음 세대 ( "보안 해시 알고리즘 3")는 현재 경쟁 후 표준화 과정에 있습니다.
암호 해싱 및 암호에서 키 파생과 같은 일부 용도의 경우 실제로 사용되는 값의 도메인 x
이 너무 작아 정상적인 (빠른) 보안 해시 기능으로이 공간을 무차별 적으로 적용 할 수 있으며 이는 우리가 원할 때입니다.
x
값을 계산하기 위해 최소한의 (바람직하게 구성 가능한) 자원이 필요합니다 H(x)
.그러나 대부분의 다른 용도의 경우 이것은 바람직하지 않습니다. 대신 원합니다.
x
값을 H(x)
가능한 빨리 계산 합니다 (아직 보안 상태 임).PBKDF2 및 scrypt와 같은 일부 구조는 자주 반복하여 빠른 해시 함수에서 느린 해시 함수를 작성합니다.
자세한 내용은 자매 사이트 Cryptography Stack Exchange 의 해시 태그 를 확인하십시오.
주요 차이점은 매우 간단합니다. 일반 해시는 실수로 충돌을 최소화하여 프로세스에서 많은 로트를 느리게하지 않으면 서 충돌을 최소화하는 것입니다.
누군가를 위해 최선을 다하더라도 충돌을 방지하기위한 안전한 해시입니다. 당신은 일반적으로 거래하고 싶지 않은 어떤 빠른 작동을 위해 충돌의 가능성을. 실제로 의도적으로 작동 속도를 느리게하면 충돌을 찾기가 더 어려워지지 않더라도 자체적으로 보안상의 이점이 있습니다.
후자의 예 : 해시를 계산하는 데 50ms가 걸리면 일반 사용자의 로그인에 영향을 미치지 않습니다 (즉, 대부분의 사용자는 로그인 할 때 50ms의 차이를 느끼지 못합니다). 동시에 공격자가 사전 공격을 원할 경우 초당 20 개의 해시 만 생성 할 수 있다는 것은 심각한 문제입니다. 장애입니다. 다시 말해, 어떤 이유로 든 안전한 해시를 위해서는 느리게하는 것이 좋습니다.
이것을 읽으십시오 http://www.codinghorror.com/blog/2012/04/speed-hashing.html 을 읽으면 내가 설명 할 수있는 것보다 훨씬 나은 모든 것을 설명합니다. 다음은 기사에서 질문을 직접 다루는 가장 중요한 두 가지 헤더입니다.
마지막에 그의 TL; DR 섹션 :
사용자 인 경우 :
모든 비밀번호가 12 자 이상인지 확인하십시오. 암호 (입력하지 않은 경우)보다 기억하기가 쉽고 암호 길이만으로도 무차별 강제 실행에 대해 엄청나게 안전한 암호 문구를 채택하는 것이 좋습니다.
개발자 인 경우 :
bcrypt 또는 PBKDF2를 독점적으로 사용하여 보안이 필요한 모든 항목을 해시하십시오. 이 새로운 해시는 GPU에서 구현하기 어렵도록 특별히 설계되었습니다. 다른 형태의 해시를 사용하지 마십시오. 거의 모든 다른 인기있는 해싱 구성표는 매년 GPU가 더 빠르고 병렬화되고 프로그래밍하기 쉬운 범용 GPU 배열에 의한 무차별 강제력에 취약합니다.
"보안"해시는 해시를 만드는 데 사용 된 메시지에 대한 사전 지식없이 공식적이고 재현 가능한 방식으로 "스푸핑"하기 어려운 것으로 여겨지는 해시입니다. 이 정보는 일반적으로 비밀이므로 해시가 필요하므로 인증에 사용하기위한 해싱 함수의 좋은 속성입니다.
메시지 M, 해시 함수 hash () 및 비트 L 단위의 길이로 hash (M)에 의해 생성 된 해시 값 H가 주어지면 해시는 일반적으로 "보안"으로 간주됩니다. O ( 2L ) 시간 :
또한 "보안"해시는 2 개의 디실 리언 수 (1.5 * 10 34 )가 되도록 해시 길이 L을 가져야 합니다 . L컴퓨터가 주어진 현재 하드웨어를 수행하는 데 필요한 단계가 아닙니다. 32 비트 정수 해시는 2.1 억 값만 가질 수 있습니다. 사전 이미지 공격 (특정 해시 H를 생성하는 메시지 찾기)에는 다소 시간이 걸리지 만 많은 컴퓨터, 특히 코드 위반으로 공인 된 정부 기관의 컴퓨터에는 적합하지 않습니다. 또한 임의의 메시지와 해시를 작성하고 저장하는 알고리즘은 확률에 따라 77,000 개의 메시지 만 시도한 후 각 새 메시지에서 중복 해시를 찾는 데 50 %의 샷을 주며 75 %의 확률로 110,000 후에 만 복제하십시오. 64 비트 해시조차도 약 50 억 개의 값만 시도해도 50 %의 확률로 충돌 할 수 있습니다. 작은 해시에 대한 생일 공격의 힘입니다. 대조적으로
암호화 해시에서 가장 많이 시연 된 공격은 충돌 공격이며 2L 미만의 시간 에 충돌 메시지를 생성 할 수있는 능력을 보여주었습니다 (대부분 여전히 지수 시간이지만 지수를 반으로 줄이면 복잡성이 크게 줄어 듭니다. 128 비트처럼 해결하기 쉬운 256 비트 해시, 64 비트처럼 해결하기 쉬운 128 비트 등).
작은 해시 크기 외에도 해시를 명백히 안전하지 않은 다른 요소는 다음과 같습니다.
낮은 작업 – 해시 테이블 또는 다른 "체크섬"유형 목적으로 사용하도록 설계된 해시는 일반적으로 계산 비용이 적게 들도록 설계되었습니다. 그것은 무차별 대입 공격을 훨씬 쉽게 만듭니다.
"Sticky State"-해싱 함수는 특정 추가 바이트의 입력이 주어질 때까지 모든 입력의 현재 해시 값이 변경되지 않는 입력 패턴에 취약합니다. "sticky state"가 있으면 충돌을 쉽게 찾을 수 있습니다. "sticky state"해시를 생성하는 메시지를 식별하면 해시를 "sticky state"로 유지하는 입력 바이트를 추가하여 동일한 해시가있는 다른 메시지를 생성하는 것은 쉽지 않습니다. ".
확산-메시지의 각 입력 바이트는 똑같이 복잡한 방식으로 해시 값의 바이트 사이에 분배되어야합니다. 특정 해시 함수는 해시의 특정 비트에 대한 예측 가능한 변경을 만듭니다. 이것은 다시 충돌 생성을 사소하게 만듭니다. 해시를 생성하는 메시지가있을 경우 예측 가능한 변경 비트에만 영향을주는 새로운 값을 메시지에 도입하여 충돌을 쉽게 만들 수 있습니다.
작업에 적합한 알고리즘을 사용하십시오.
CRC는 오류 감지 / 수정에 사용됩니다.
SHA2와 같은 암호화 메시지 요약은 암호화 구성 (디지털 서명, MAC, 키 파생 / 암호 해싱 기능) 및 보안 프로토콜의 구성 요소로 사용됩니다.
해시 테이블 / 사전 / 맵에서 SipHash를 사용 하십시오 .
당신이 전화를 불안 해싱 알고리즘은 해시 테이블에서 사용할 수 없습니다 다음 CVE 항목에 의해 입증 된 바와 같이, : CVE-2011-2012, CVE-2003-0364, CVE-2011-4461, CVE-2011-4838, CVE-2011-4885 4462, CVE-2011-4815, CVE-2012-0840, CVE-2012-5371 , CVE-2012-5374, CVE-2012-5375