为何修改correct_hash会影响C语言SHA1实现的输出?
问题原因分析
你的问题核心是栈内存越界读取引发的意外行为,correct_hash本身不会直接影响SHA1逻辑,但它在栈上的位置刚好被错误的内存访问波及,具体问题点如下:
strlen误用导致越界读内存
调用SHA1时,你用strlen((char *)salted_password)作为输入长度,但salted_password是二进制数组,没有字符串终止符\0。strlen会持续读取内存直到遇到\0,而栈上变量是连续排布的,correct_hash刚好和salted_password相邻,所以strlen会把correct_hash的内容也算进长度里,导致SHA1处理的输入字节数错误。SHA1输出覆盖password数组
你把password数组作为SHA1的输出缓冲区,SHA1会将计算出的20字节哈希值写入这里,覆盖原内容。由于第一步中输入长度受correct_hash影响,SHA1计算出的哈希值会变化,最终password数组的内容跟着改变,printf的输出自然也就变了。
修复建议
- 直接用固定长度代替
strlen:SHA1处理的是固定的8字节salt+20字节password,所以调用时写SHA1(salted_password, 28, password); - 打印哈希值不要用
%s(二进制哈希含不可打印字符或\0),改成逐字节打印十六进制:for (int i = 0; i < 20; i++) { printf("%02x", password[i]); } printf("\n");
内容的提问来源于stack exchange,提问作者user14486870
相关产品推荐
相关产品推荐

