为何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
相关产品推荐
相关产品推荐

