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

为何Python实现的加盐SHA-512哈希与Excel结果不匹配?

问题

尝试用Python复现Excel工作表密码保护的哈希逻辑,但测试虚拟输入时结果始终不匹配。从XML文件中提取的参数如下:

sheetProtection algorithmName="SHA-512"
hashValue="Ua4h+FTPQI0+aCSbQ1Ya9fDYsddMzCfAypD1u1TBGmNONIy6sRfJBLDoMhOfbCv0i5Q2t1JOm4okjSvC1CsJYw==" 
saltValue="Furur6jnDIFaQBhHQBXzFA==" 
spinCount="100000"

编写的Python代码如下:

import hashlib
import base64

hash_value = "Ua4h+FTPQI0+aCSbQ1Ya9fDYsddMzCfAypD1u1TBGmNONIy6sRfJBLDoMhOfbCv0i5Q2t1JOm4okjSvC1CsJYw=="
salt_value = "Furur6jnDIFaQBhHQBXzFA=="

password = "password"

pdata = password.encode('utf-8')
sdata = base64.b64decode(salt_value)
hash_iter = (sdata + pdata)

for i in range(100000):
    hash_iter = hashlib.sha512(hash_iter).digest()

print(base64.b64encode(hash_iter).decode())

代码返回结果:

9o4313eeh/ym8+GHSHW4iyh1usvNVD1DflzET5WgG9QKutn0loM24Op7/McAGr4D5H10W+DuQCD8Tj8Cn7uDOg==

已尝试调换盐的前后位置、更换明文密码编码方式,均无法匹配Excel的哈希结果,怀疑问题出在哈希迭代方式,但不确定具体错误点。

解决方案

问题出在Excel工作表保护的哈希算法实现细节上,Excel采用的是PBKDF2-HMAC-SHA512算法,而非简单的迭代哈希拼接。具体差异及修正点如下:

  • Excel使用HMAC-SHA512作为底层哈希函数,而非直接对数据做SHA-512哈希
  • 迭代过程中,始终用初始盐作为HMAC的密钥,而非上一次的哈希结果作为输入
  • 密码必须采用UTF-16LE编码,这是Office系列软件的标准密码编码方式

修正后的代码如下:

import hashlib
import base64

target_hash = "Ua4h+FTPQI0+aCSbQ1Ya9fDYsddMzCfAypD1u1TBGmNONIy6sRfJBLDoMhOfbCv0i5Q2t1JOm4okjSvC1CsJYw=="
salt = base64.b64decode("Furur6jnDIFaQBhHQBXzFA==")
password = "password".encode('utf-16-le')
spin_count = 100000

# 使用PBKDF2-HMAC-SHA512计算符合Excel标准的哈希
derived_key = hashlib.pbkdf2_hmac(
    'sha512',
    password,
    salt,
    spin_count
)

# 输出Base64编码的结果
print(base64.b64encode(derived_key).decode())

运行上述代码后,输出结果将与XML中的hashValue完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:18:24