C#生成PPK v3文件:HMAC-SHA-256的Private-Mac计算错误排查
PPK v3 基于HMAC-SHA256的Private-Mac正确计算方法
核心密钥派生逻辑(空密码场景)
PPK v3的MAC密钥不是直接取空字符串的SHA256哈希,必须严格遵循Putty的PBKDF2派生规则:
- 盐值为固定ASCII字符串:
putty-private-key-file-mac-key(无末尾换行) - 使用PBKDF2算法,参数配置:
- 输入密码:空字节序列(即长度为0的字节数组)
- 盐:上述固定字符串的UTF-8字节
- 迭代次数:1000次
- 输出密钥长度:32字节(SHA256标准密钥长度)
- 底层哈希函数:SHA256
Private-Mac的计算范围
必须对PPK文件中从Private-Lines字段起始,到Private-MAC字段之前的所有字节计算HMAC:
- 包含
Private-Lines:字段名、后续的换行符(注意Putty使用\r\n作为换行) - 包含所有私钥行的内容及每行末尾的
\r\n - 不包含
Private-MAC:字段本身及后续内容
最终计算步骤
- 按上述规则生成32字节的HMAC密钥
- 提取目标范围的原始字节流(严格匹配文件中的换行格式)
- 用SHA256作为哈希算法,计算该字节流的HMAC值
- 将HMAC的二进制结果做Base64编码,得到的字符串就是
Private-MAC字段的值
常见错误点排查
- 跳过PBKDF2直接用空串SHA256当密钥:这是v1/v2的逻辑,v3强制要求PBKDF2派生
- 计算范围错误:比如漏掉
Private-Lines:字段名或换行符,或者误包含了Private-MAC字段 - 换行符格式不匹配:代码中用
\n但Putty生成的文件用\r\n,导致字节流不一致 - Base64编码前额外处理哈希值:必须直接对HMAC的二进制结果编码,不要做hex转换或其他修改
内容的提问来源于stack exchange,提问作者Ana
相关产品推荐
相关产品推荐

