首先 SHA 也好、MD5 也罢,并不是“加密”,而是“哈希”(也有翻译成“摘要”、“散列”、“杂凑”等等,是一个意思)。有加密必有解密,加密时“明文→密文”,解密时“密文→明文”,二者互为逆运算。而哈希是不可逆的,哈希时“信息→摘要”,却无法反推过来(你可能会知道有彩虹表,但这并不是基于运算,而是硬编码查表而已)。其次哈希算法一般最后都会转写为 16 进制格式,也就是整个字符串只会由 0-9+A-F 构成,仅仅是长度上有区别而已。但这种字符串并非一定是哈希值,有可能就是随便打出来的,原文就是如此。比如你看“7A7C42D6206B69846E6C51FAF19F2DEA” 这串字符串,像不像一个哈希值?确实像,甚至有可能确实就是某段数据通过某种哈希算法后生成的值,但这里其实只是我随机生成的而已:所以给定一段 16 进制的字符串,并不能判断字符串是否哈希过、还是原文就是如此。除非你事先知道原文一定不是这种格式的,否则这就是无解的。最后说长度。MD5 的结果是 128 位(即 32 个字符),SHA1 的结果是 160 位(即 40 个字符),SHA256 的结果是 256 位(即 64 个字符)。所以如果已知一个哈希值一定只能是 MD5、SHA1、SHA256 三种算法产生的,那确实可以通过长度来判定是哪一种。但如果并没有这种限定,那就无从推断了。
首先 SHA 也好、MD5 也罢,并不是“加密”,而是“哈希”(也有翻译成“摘要”、“散列”、“杂凑”等等,是一个意思)。
有加密必有解密,加密时“明文→密文”,解密时“密文→明文”,二者互为逆运算。
而哈希是不可逆的,哈希时“信息→摘要”,却无法反推过来(你可能会知道有彩虹表,但这并不是基于运算,而是硬编码查表而已)。
其次哈希算法一般最后都会转写为 16 进制格式,也就是整个字符串只会由 0-9+A-F 构成,仅仅是长度上有区别而已。
但这种字符串并非一定是哈希值,有可能就是随便打出来的,原文就是如此。比如你看“7A7C42D6206B69846E6C51FAF19F2DEA” 这串字符串,像不像一个哈希值?
确实像,甚至有可能确实就是某段数据通过某种哈希算法后生成的值,但这里其实只是我随机生成的而已:
所以给定一段 16 进制的字符串,并不能判断字符串是否哈希过、还是原文就是如此。除非你事先知道原文一定不是这种格式的,否则这就是无解的。
最后说长度。MD5 的结果是 128 位(即 32 个字符),SHA1 的结果是 160 位(即 40 个字符),SHA256 的结果是 256 位(即 64 个字符)。
所以如果已知一个哈希值一定只能是 MD5、SHA1、SHA256 三种算法产生的,那确实可以通过长度来判定是哪一种。但如果并没有这种限定,那就无从推断了。