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

key_add返回相同签名值问题排查(eCryptfs用户密钥环场景)

问题根因

你的代码存在两个核心问题,共同导致了该现象:

  • OpenSSL摘要算法未正确初始化,且所有EVP接口调用均未做返回值校验
    如果你使用的是1.1.0之前版本的OpenSSL,有两个必然触发的问题:一是必须在调用EVP_get_digestbyname前执行OpenSSL_add_all_digests()加载所有内置摘要算法,否则算法查询会失败;二是BLAKE2B512摘要算法是1.1.0版本才新增支持的,老版本根本不存在该算法。
    你的代码完全没有检查EVP_get_digestbyname以及后续EVP_DigestInit_ex/EVP_DigestUpdate/EVP_DigestFinal_ex的返回值,当拿不到摘要算法结构体指针时,整个哈希计算流程完全失效:
    • RAND_priv_bytes确实生成了随机数据写入random_bytes数组,但这些数据根本没有被送入哈希上下文计算,这也是你观察到随机字节每次变化但结果不变的直接原因
    • 哈希接口执行失败后,不会往md_res/md2_res写入结果,也不会给md_len/md2_len赋值,这几个栈上变量留存的是程序启动时的固定垃圾值。
  • Linux密钥环的键匹配规则+进程栈布局固定
    add_key系统调用的逻辑是:如果目标密钥环中已经存在类型、描述符、载荷内容、载荷长度完全一致的键,不会创建新键,直接返回已有键的序列号。
    你的程序逻辑非常简单,编译后运行时栈布局完全固定,因此每次运行时md_res/md2_res/md_len/md2_len里的垃圾值完全相同。第一次运行时这组固定垃圾值作为载荷被加入用户密钥环,后续每次运行传入的参数都和已存在的键完全匹配,因此直接返回第一次生成的键ID,看起来就像签名完全没有变化。
修复方案
  • 所有OpenSSL接口调用必须校验返回值,出现错误时通过ERR_print_errors_fp打印错误信息后退出,不要静默继续执行
  • 若使用OpenSSL 1.1.0以下版本,在调用摘要查询接口前执行OpenSSL_add_all_digests()初始化算法表,老版本环境下请替换BLAKE2B512为受支持的摘要算法
  • 栈上的缓冲区、长度变量使用前先初始化清零,避免垃圾值传入系统调用
  • 测试阶段每次运行前可执行keyctl clear @u清空用户密钥环,避免残留键影响结果判断
验证方法

先执行keyctl clear @u清空当前用户密钥环,再运行程序,第一次会得到新的键ID,后续不清理密钥环重复运行都会返回同一个ID,即可复现验证上述逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:09:20