Grub 的 MD5 算法是如何工作的?当您运行 grub-md5-crypt 并输入相同的密码时,每次都会得到不同的结果。一般来说,md5 应该总是返回相同的哈希值,那么为什么 grub 的版本每次都返回不同的内容呢?
另外,考虑到这一点,那么如何确定您输入的密码正确呢?如果使用相同密码的每次加密创建都会生成不同的哈希值,那么稍后当您输入密码时(理论上使用相同的算法),由于哈希值会不同,它们如何匹配以显示给您提供了正确的密码?
我假设某个地方使用了盐,并且盐是随机生成的,但是盐是什么,它是如何准确生成的,然后是如何复制的?
答案1
grub 源代码是查找的最佳位置。必要的逻辑位于stage2/md5.c
:
int md5_password (const char *key, char *crypted, int check)
它生成以下形式的字符串:$1$aaaaaaaa$bbbbbbbbbbbbbbbbbbbbbb
其中“aaaaaaaa”序列是随机盐,“bbbbbbbbbbbbbbbbbbbbbbbb”是以特定方式将密码和盐混合 1000 次的结果,并采用修改后的 base64 编码md5 结果。
修改后的base64字典是:
./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
实际的混合算法可以根据 GNU 通用公共许可证版本 2(或任何更高版本)的条款重新分发,您可以从GNU FTP 站点或任何 GNU 镜像。
答案2
该密码哈希是加盐的。盐是随机生成的并与哈希一起存储。 salt 和 hash 之间的字段分隔符是美元符号 ($)。