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

解决RFC6030 PSKC XML中<ValueMac>生成与示例不符的问题

解决RFC6030 PSKC XML中的生成问题

我之前在做RFC6030加密PSKC文件的时候也踩过这个的坑,刚好能帮你理清问题所在!

问题回顾

你已经成功生成了MAC密钥和TOTP密钥的AES-CBC-128密文,但最初生成的和RFC6030示例不符,核心问题是对的生成逻辑理解有误。

错误原因分析

你之前的HMAC代码犯了两个关键错误:

  1. 用**加密密钥($encryptionkey)**作为HMAC的密钥,而不是原始的未加密MAC密钥($mackey)
  2. 拼接了MAC密文原文和密钥密文原文($ciphertext_raw_mac.$ciphertext_raw_secret),但实际上应该计算的是**密钥密文的完整加密块(IV + 密钥密文原文)**的HMAC

正确的生成逻辑

根据RFC6030第6.1节的定义,的生成规则是:

使用未加密的MAC密钥作为HMAC密钥,对IV + 密钥密文原文的二进制串计算SHA1-HMAC,最后将结果转为Base64编码

正确代码实现

替换你之前的HMAC生成代码为:

// 生成正确的<ValueMac>
$hmac = hash_hmac('sha1', $ivsecret.$ciphertext_raw_secret, $mackey, $as_binary=true);
echo "正确的hmac = ".base64_encode ($hmac)."<br>";
// 输出结果:Su+NvtQfmvfJzF6bmQiJqoLRExc=,和RFC6030示例一致

关键要点总结

  • HMAC密钥必须是原始的未加密MAC密钥:不能用加密用的$encryptionkey,因为MAC是用来验证密钥密文完整性的,需要独立的MAC密钥
  • 计算HMAC的内容是完整的密钥加密块:要包含加密时用的IV($ivsecret)和密钥密文原文($ciphertext_raw_secret),这才是RFC要求的待验证数据
  • 保持二进制数据完整性:所有拼接和计算都要用二进制串,不要中途转Base64再操作,否则会破坏数据结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:52:47