2009-12-14 3 views
1

파일을 저장하는 응용 프로그램의 일부가 있습니다. 잠재적으로 동일한 파일을 여러 개 추가 할 수 있으므로 먼저 각 파일의 해시를 유지합니다. 두 파일의 해시가 같으면 하나를 버리고 두 파일의 "참조"가 동일한 실제 파일을 가리 킵니다.응용 프로그램에서 체크섬 충돌을 어떻게 처리해야합니까?

  1. 해시 충돌에 대해 얼마나주의해야합니까?

  2. 충돌이 발생한 경우 어떻게해야합니까? 지금까지 내 코드의 핵심은 동일한 해시를 가진 두 개의 다른 파일이 존재하지 않는다는 점에 달려있다. 지금 충돌이 발생하면 내 응용 프로그램은 합법적으로 다른 파일을 버리고 동일한 해시를 가진 파일을 가리 킵니다.

  3. MD5 이외의 것을 사용해야합니까? SHA-1의 충돌 속도는 더 빠릅니까?

+3

체크섬!= hash – jldupont

+0

@jldupont는 일반적으로 해시 함수에서 파생되지 않은 체크섬입니까? 이 구별을 설명해 주시겠습니까? – KingNestor

+1

@KingNestor : 일반적으로 해시는 전체 도메인에서의 충돌을 최소화하여 해시 테이블 등에서 사용할 수 있도록 설계되었습니다. 체크섬은 전사 오류 (또는 유사)가 그 중 하나를 다른 것으로 쉽게 전환 할 가능성이있는 입력 간의 충돌을 최소화하도록 설계되었습니다. 물론 안전한 단방향 함수를 사용하면 두 가지 요구 사항 중 하나라도 충족시킵니다. –

답변

4

정말 중요한 응용 프로그램에 있지 않으면 해시 충돌에 대해 걱정하지 마십시오. 그들은 매우 희귀하기 때문에 많은 일들이 일어나지 않을 것이라고 가정하고, 그 가정이 단지 한 번 거짓 일 뿐이라면 격변적인 일이 일어날 것입니다.

SHA1은 MD5보다 큰 출력 공간을 가지고 있습니다 (공격도 적음). 따라서 더 나쁜 선택은 아닙니다. SHA-256과 같이 나중에 SHA의 변형 인 해시를 공격적으로 충돌하는 사람을 두려워하면 좋은 생각 일 수 있습니다.

+1

SHA-1 충돌이 곧 나타날 것입니다 (http://www.schneier.com/blog/archives/2009/06/ever_better_cry.html). SHA-256은 더 안전합니다. 코드가 미래에 쉽게 새 해시로 쉽게 이동할 수 있도록 설계되었습니다. –

2

임의로 선택된 두 비트 스트림의 해시 간의 충돌 확률은 해시가 나타내는 개별 상태 수에 반비례합니다. 따라서 64 비트 해시는 2 ** 64 상태를 인코딩하고 모든 파일 쌍에 대해 1/(2**64)의 충돌 가능성을 갖습니다. 그러나 당신은 정말 (큰) 파일 세트에 충돌 할 가능성에 관심이 있습니다. 따라서 pairwise 충돌 가능성과 예상 파일 수를 연결하여 "생일 패러독스"계산을 수행해야합니다.

하지만 결론은 비교를하지 않고 파일을 버리는 것이 위험한 일이라고 생각합니다. 충돌 횟수가 적을지라도 말입니다.

+0

SHA-1은 160 비트 해시입니다. 하나는 2^80 파일을 저장할 때 더 큰 확률로 발생하는 다른 실패 모드입니다 .-) 진짜로 위험한 것은 두 개의 충돌 파일을 악의적으로 제공하거나 두 개의 충돌 파일을 생성하도록 프로그램을 강제하는 것입니다. –

0

제공된 시나리오에서는 걱정할 필요가 없습니다. 동일하지 않으면 두 개의 다른 문서가 동일한 체크섬을 가질 수 없습니다. 상상해보십시오 :

var a = 1; var b = 2;

b + 3 = 5; // 사실 이예요! a + 3! = 5; // var a가 2가 아닌 한 충돌은 불가능합니다.

var 'a'는 2가 아닌 다른 값으로 계산할 수 없으므로 충돌이 발생하지 않습니다. 1 방향 체크섬 해싱 알고리즘을 사용하고 있거나 사용 중이어야하기 때문에 해시 결과는 항상 입력에 따라 달라집니다.

무작위로 생성 된 해시를 처리 할 때 해시 충돌이 발생합니다. 가능성은 매우 낮습니다.

참고 : 단방향 해싱 알고리즘이 간단한 추가를 통해 수행된다는 것을 결코 추론 할 수 없습니다. 저는 단순한 예제로서 추가를 사용하고 있습니다. 단순한 개념에 기반한 간단한 예제는 값 집합을 가져 와서 다른 집합 값을 출력한다는 것입니다.