Contrary to what the most upvoted answers here emphasize, the non-injectivity (i.e. that there are several strings hashing to the same value) of a cryptographic hash function caused by the difference between large (potentially infinite) input size and fixed output size is not the important point – actually, we prefer hash functions where those collisions happen as seldom as possible.
Consider this function (in PHP notation, as the question):
function simple_hash($input) {
return bin2hex(substr(str_pad($input, 16), 0, 16));
}
This appends some spaces, if the string is too short, and then takes the first 16 bytes of the string, then encodes it as hexadecimal. It has the same output size as an MD5 hash (32 hexadecimal characters, or 16 bytes if we omit the bin2hex part).
print simple_hash("stackoverflow.com");
This will output:
737461636b6f766572666c6f772e636f6d
This function also has the same non-injectivity property as highlighted by Cody's answer for MD5: We can pass in strings of any size (as long as they fit into our computer), and it will output only 32 hex-digits. Of course it can't be injective.
But in this case, it is trivial to find a string which maps to the same hash (just apply hex2bin
on your hash, and you have it). If your original string had the length 16 (as our example), you even will get this original string. Nothing of this kind should be possible for MD5, even if you know the length of the input was quite short (other than by trying all possible inputs until we find one that matches, e.g. a brute-force attack).
The important assumptions for a cryptographic hash function are:
- it is hard to find any string producing a given hash (preimage resistance)
- it is hard to find any different string producing the same hash as a given string (second preimage resistance)
- 동일한 해시 (충돌 저항)를 가진 문자열 쌍을 찾기가 어렵습니다.
분명히 내 simple_hash
기능은 이러한 조건을 충족하지 않습니다. (사실, 입력 공간을 "16 바이트 문자열"로 제한하면 내 함수가 주입 형이되어 2 차 이미지 및 충돌 방지가 입증 될 수 있습니다.)
이제 MD5에 대한 충돌 공격이 존재합니다 (예 : 동일한 접두사를 사용하여 동일한 해시를 사용하고 상당한 작업을 수행하지만 불가능하지는 않은 작업으로도 문자열 쌍을 생성 할 수 있음). 따라서 사용하지 않아야합니다. 중요한 모든 것을위한 MD5. 아직 사전 이미지 공격은 없지만 공격은 더 나아질 것입니다.
실제 질문에 답하려면 :
결과 문자열을 다시 추적 할 수 없게 만드는 함수는 무엇입니까?
MD5 (및 Merkle-Damgard 구조에 구축 된 기타 해시 함수)가 효과적으로 수행하는 작업은 결과 암호문을 해시로 사용하여 메시지를 키로, 고정 값을 "일반 텍스트"로 사용하여 암호화 알고리즘을 적용하는 것입니다. (그 전에는 입력이 패딩되고 블록으로 분할되며,이 각 블록은 이전 블록의 출력을 암호화하는 데 사용되며, 역 계산을 방지하기 위해 입력과 XOR 처리됩니다.)
최신 암호화 알고리즘 (해시 함수에 사용되는 알고리즘 포함)은 일반 텍스트와 암호문 (또는 공격자가 둘 중 하나를 선택하는 경우에도)이 주어 지더라도 키를 복구하기 어렵게 만드는 방식으로 만들어졌습니다. 일반적으로 각 출력 비트가 각 키 비트 (여러 번) 및 각 입력 비트에 의해 결정되는 방식으로 많은 비트 셔플 링 작업을 수행합니다. 이렇게하면 전체 키와 입력 또는 출력을 알고있는 경우에만 내부에서 일어나는 일을 쉽게 되돌아 갈 수 있습니다.
MD5와 같은 해시 함수 및 사전 이미지 공격 (일을 쉽게하기 위해 단일 블록 해시 문자열 사용)의 경우 암호화 함수의 입력 및 출력 만 있고 키는 없습니다 (찾고있는 것입니다).