해싱 알고리즘이 "안전한"이유는 무엇입니까?


19

흥미로운 질문을 읽은 후 , 내가 필요하다면 어떤 안전하지 않은 해싱 알고리즘을 사용해야하는지에 대한 좋은 생각이 들었지만, 대신 안전한 알고리즘을 사용해야하는 이유는 모르겠습니다.

그렇다면 차이점은 무엇입니까? 출력은 해시 된 것을 나타내는 임의의 숫자가 아닙니까? 해싱 알고리즘을 안전하게 만드는 이유는 무엇입니까?


8
이 질문은 IT 보안 SE 사이트에 더 적합합니다 .
Bernard

@Bernard이 경우라면 괜찮습니다.하지만 보안 해시를 사용하는 방법과시기에 관한 것이 아니라 보안 해싱 알고리즘과 안전하지 않은 알고리즘을 구별하는 것은 내 질문이었습니다. 그것은 나에게 프로그래밍 질문처럼 보이지만 IT Security SE를 탐색하지 않으므로 거기에서도 효과가 있습니다.
CodexArcanum

2
IT 보안에 대해 매우 비슷한 질문 이 이미 제기되었습니다
ChrisF

답변:


34

모든 암호화 해시 함수에서 원하는 세 가지 속성이 있습니다 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 의 해시 태그 를 확인하십시오.


3

보안은 충돌을 사용하여 오류를 유발하려는 사람 (즉, 두 소스가 동일한 값으로 해시된다는 사실)에 어려움이 있음을 의미합니다.

일부 특성 :

  • 해시를 알고, 해당 값으로 해시하는 파일을 작성하는 것은 어렵습니다 (변형, 새 파일의 일부 및 원하는 해시가 제공됨)

  • 동일한 값으로 해시하는 두 개의 다른 파일을 작성하는 것은 어렵습니다 (파일의 일부가 제공됨)


3

주요 차이점은 매우 간단합니다. 일반 해시는 실수로 충돌을 최소화하여 프로세스에서 많은 로트를 느리게하지 않으면 서 충돌을 최소화하는 것입니다.

누군가를 위해 최선을 다하더라도 충돌을 방지하기위한 안전한 해시입니다. 당신은 일반적으로 거래하고 싶지 않은 어떤 빠른 작동을 위해 충돌의 가능성을. 실제로 의도적으로 작동 속도를 느리게하면 충돌을 찾기가 더 어려워지지 않더라도 자체적으로 보안상의 이점이 있습니다.

후자의 예 : 해시를 계산하는 데 50ms가 걸리면 일반 사용자의 로그인에 영향을 미치지 않습니다 (즉, 대부분의 사용자는 로그인 할 때 50ms의 차이를 느끼지 못합니다). 동시에 공격자가 사전 공격을 원할 경우 초당 20 개의 해시 만 생성 할 수 있다는 것은 심각한 문제입니다. 장애입니다. 다시 말해, 어떤 이유로 든 안전한 해시를 위해서는 느리게하는 것이 좋습니다.


3
암호화 해시 기능 영역에는 두 가지 중요한 하위 그룹이 있습니다. 메시지 그룹, 서명 등에 사용되는 빠른 그룹과 키 파생 및 암호 해싱에 사용되는 느린 그룹입니다. 이것들을 섞지 마십시오. 둘 다 적용 할 수 있습니다.
Paŭlo Ebermann

실제로 충돌 을 최대화 하도록 설계된 해시 함수도 있습니다 . Soundex가 그 예입니다. 분명히 이것은 매우 까다로운 보안 해시 기능입니다.
Jörg W Mittag

@ JörgWMittag : 보안 해시로 크 래핑뿐만 아니라 해시 테이블과 함께 사용하기에는 매우 좋지 않습니다. 다시 말하지만, 확실히 해시와 비슷하지만 Soundex를 해시 함수라고 부르는 것은 주저하지 않았습니다. 단순히 의도와 용도가 일반적인 해시 함수와 완전히 다르기 때문입니다.
Jerry Coffin

@ JerryCoffin : 나는 그것이 정의에 달려 있다고 생각합니다. 예를 들어 영어 위키 백과 페이지는 단순히 해시 함수가 더 큰 (잠재적으로 무한한) 임의의 값 세트를 더 작고 유한 한 (일반적으로 스칼라) 값으로 매핑하는 알고리즘 또는 서브 루틴이라고 말합니다. 독일 위키 백과 페이지에 따르면 "해싱"(독일어 : "zerhacken")은 필수적인 부분입니다. 즉 충돌 방지 및 매핑 된 값의 분포가 중요합니다. Soundex는 첫 번째 정의를 많이 충족하지만 두 번째 정의는 충족하지 않습니다.
Jörg W Mittag

3

이것을 읽으십시오 http://www.codinghorror.com/blog/2012/04/speed-hashing.html 을 읽으면 내가 설명 할 수있는 것보다 훨씬 나은 모든 것을 설명합니다. 다음은 기사에서 질문을 직접 다루는 가장 중요한 두 가지 헤더입니다.

  • 보안 해시는 변조 방지되도록 설계되었습니다
    • 입력 데이터의 작은 단일 비트 변경으로 출력을 크게 변경
  • 보안 해시는 느리게 설계되었습니다

마지막에 그의 TL; DR 섹션 :

사용자 인 경우 :

모든 비밀번호가 12 자 이상인지 확인하십시오. 암호 (입력하지 않은 경우)보다 기억하기가 쉽고 암호 길이만으로도 무차별 강제 실행에 대해 엄청나게 안전한 암호 문구를 채택하는 것이 좋습니다.

개발자 인 경우 :

bcrypt 또는 PBKDF2를 독점적으로 사용하여 보안이 필요한 모든 항목을 해시하십시오. 이 새로운 해시는 GPU에서 구현하기 어렵도록 특별히 설계되었습니다. 다른 형태의 해시를 사용하지 마십시오. 거의 모든 다른 인기있는 해싱 구성표는 매년 GPU가 더 빠르고 병렬화되고 프로그래밍하기 쉬운 범용 GPU 배열에 의한 무차별 강제력에 취약합니다.


4
Jeff는 두 번째 요점에서 여기에 잘못이 있습니다 ... 일부 용도 (암호 해시 및 암호에서 키 파생으로)의 경우 다른 용도 (예 : 메시지 인증, 서명 등)가 빠르기를 원합니다 (보안) 해시 함수가 좋습니다.
Paŭlo Ebermann

당신은 정확한 Paŭlo입니다. 해시의 성능은 해시의 응용 프로그램에 따라 다릅니다. 그러나 느린 해시는 항상 빠른 것 보다 안전 합니다. 빠른 해시를 사용하는 이유는 성능을 위해 보안을 희생해도 괜찮은 것입니다.
Nate

2
@Nate“더 안전”은 항상 모호하지만 가장 자선적인 응용 프로그램에서도“느린 해시는 빠른 것보다 더 안전합니다”라는 것은 확실히 잘못된 것입니다. 해시 속도와 관련이없는 많은 응용 프로그램이 있습니다.
Gilles 'SO- 악마 중지'

@Gilles 예를 들어 주시겠습니까? 그것은 실제로 나에게 들리지만 더 자세한 내용이 도움이 될 것입니다.
Nate

2
@Nate 해시의 가장 분명한 적용은 데이터의 무결성을 확인하는 것입니다. 안전하지만 대역폭이 낮은 채널을 통해 해시를 전송하고 안전하지 않은 채널을 통해 가능한 큰 페이로드를 전송 한 다음 수신 된 페이로드에 예상 한 값이 있는지 확인하십시오 해시시. 해시는 서명 방법 (명확성을 검증 할뿐만 아니라 데이터를 보낸 사람도)에서 두드러지게 나타납니다. 비밀번호 해싱은 예외입니다.
Gilles 'SO- 악마 그만'

2

"보안"해시는 해시를 만드는 데 사용 된 메시지에 대한 사전 지식없이 공식적이고 재현 가능한 방식으로 "스푸핑"하기 어려운 것으로 여겨지는 해시입니다. 이 정보는 일반적으로 비밀이므로 해시가 필요하므로 인증에 사용하기위한 해싱 함수의 좋은 속성입니다.

메시지 M, 해시 함수 hash () 및 비트 L 단위의 길이로 hash (M)에 의해 생성 된 해시 값 H가 주어지면 해시는 일반적으로 "보안"으로 간주됩니다. O ( 2L ) 시간 :

  • 주어진 hash ()와 H는 M을 생성합니다 (사전 이미지 저항)
  • 주어진 hash () 및 M, hash (M 2 )와 다른 M 2 생성 ) == H. (약한 충돌 저항)
  • 주어진 hash (), hash (M 1 ) == hash (M 2 ) 와 같은 M 1 및 M 2를 생성하십시오 . (강한 충돌 저항)

또한 "보안"해시는 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"로 유지하는 입력 바이트를 추가하여 동일한 해시가있는 다른 메시지를 생성하는 것은 쉽지 않습니다. ".

확산-메시지의 각 입력 바이트는 똑같이 복잡한 방식으로 해시 값의 바이트 사이에 분배되어야합니다. 특정 해시 함수는 해시의 특정 비트에 대한 예측 가능한 변경을 만듭니다. 이것은 다시 충돌 생성을 사소하게 만듭니다. 해시를 생성하는 메시지가있을 경우 예측 가능한 변경 비트에만 영향을주는 새로운 값을 메시지에 도입하여 충돌을 쉽게 만들 수 있습니다.


0

작업에 적합한 알고리즘을 사용하십시오.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.