字符串的 md5(或任何散列)是否在其计算中包含空终止符?也就是说,字符串的哈希值是否等于表示字符串的字节序列的哈希值减去空终止符。
字符串的 md5(或任何散列)是否包含空终止符?
我认为这更多地取决于散列算法的实现,而不是它们散列包括空终止符本身在内的空终止字符串的能力。
在Gentoo Linux和TrustedJava(在 jTSS 0.4a之前)中用作加密库之一的TrouSerS(基于 Trousers 软件堆栈 1.1 或更早版本的 0.2 版)中观察到了一些此类哈希函数实现的出现,在 IBM Client Security Software 中,两种实现都在密码弹出对话框条目中包含空终止符(空终止字符串,包括空终止符本身)。
同样,您可以在将纯文本传递给散列函数之前对其进行UTF-16编码,从而导致输入中的每个其他字符都被处理为非扩展字符的空字符0x00或空字符,该函数将输入作为纯ASCII处理。根据散列算法本身、其预期目的和输入长度,这可能是有益的(例如,对密码散列安全性,例如hashcat 在这些方面存在一些问题),或者导致密码熵降低,如果这会导致散列算法忽略部分输入(例如bcrypt ,一种基于Blowfish的加密密钥拉伸散列算法实现 对称分组密码,将明文限制为 72、55 或 51 个字符 - 取决于您询问的对象 - 并忽略其余字符)。
至于是否在您的散列算法的输入中包含空终止符的一般建议,我没有,您应该更具体地了解您正在散列数据的预期用途(我们是在谈论密码存储的加密散列还是HMAC在这里?),并且会根据您的特定需求和选择的哈希算法而有很大差异。
我会冒险猜测:它不应该。字符串值和它的空终止符是两个不同的东西。
空终止可能是另一台机器/操作系统/编译器上的其他东西,但值应该保持不变。
所以我假设 MD5 没有考虑字符串在特定机器上的存储方式,因此只有 MD5 字符串“值”(或内容),而不是它的完整机器表示。
(关于一个稍微相关的说明:请参阅 C-faq 以了解为什么您不能对内部表示进行任何假设的有趣见解。在 C 中,但可以扩展到几乎所有内容。在 C-faq 中有很好的示例,对于空指针,在 C 程序中的许多情况下,它可以被视为“0”,但它可以是内部的任何东西(参见一些示例:http ://c-faq.com/null/machexamp.html )。并且在这里,我们谈论一个字符串的 md5(或其他),所以它应该是程序/操作系统/任何依赖项,并且由于内部表示可以改变,它必须是字符串的值而不包括它的存储终止符)。