The weakest link in security are humans. This is both good (when you have a system where the weakest link isn’t technology means that you succeeded from a technological standpoint) and bad (because you must learn new skills to try to mitigate the new threat).
A couple of days ago I downloaded the Ubuntu 8.04 ISO and checked the MD5 (mainly to see if it was corrupted) when I remembered something I’ve read somewhere (sorry for remembering the exact source, if someone could provide the link I’ll update the post – or maybe it is just one of these ideas floating out there):
While MD5’s aren’t the strongest hash out there, the way people tend to check them makes it even less secure. We tend to check them by looking at the first few digits and (maybe) at the last ones. We are trained to recognize words by length and letter composition, not necessarily by the exact content. This means that creating a hash which would fool a human with a big probability is much simpler than creating an exact match.
The method I usually use if pasting the two hashes I wish to compare in a text editor (vi, emacs, nano, gedit, whatever makes you happy) one below the other, and then scanning horizontally for differences. I found that doing this is a quick (and much more reliable) method for spotting differences.
BTW, the same idea applies to other hashes or situations where people are asked to compare complex (and for them meaningless) strings. These steps should always be performed by computers in the security systems. This is something SSH gets right for example, because it compares the fingerprint of the server and warns you if there isn’t an exact match. Of course this is only a partial solution because you have to confirm the new fingerprint by some other channel (by phone for example) and we’re back to the situation of people comparing long and complex strings.