解决RFC6030 PSKC XML中<ValueMac>生成与示例不符的问题
解决RFC6030 PSKC XML中的生成问题
我之前在做RFC6030加密PSKC文件的时候也踩过这个
问题回顾
你已经成功生成了MAC密钥和TOTP密钥的AES-CBC-128密文,但最初生成的
错误原因分析
你之前的HMAC代码犯了两个关键错误:
- 用**加密密钥($encryptionkey)**作为HMAC的密钥,而不是原始的未加密MAC密钥($mackey)
- 拼接了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
相关产品推荐
相关产品推荐

