You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何修改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的输出自然也就变了。

修复建议

  1. 直接用固定长度代替strlen:SHA1处理的是固定的8字节salt+20字节password,所以调用时写SHA1(salted_password, 28, password);
  2. 打印哈希值不要用%s(二进制哈希含不可打印字符或\0),改成逐字节打印十六进制:
    for (int i = 0; i < 20; i++) {
        printf("%02x", password[i]);
    }
    printf("\n");
    

内容的提问来源于stack exchange,提问作者user14486870

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 16:52:16