如果你执意想要找回保护当前工作表的密码,好吧,我来告诉你有多难:
Excel使用一种在XML文件中以哈希形式存储用于工作表保护的密码的方法。
从Excel 2013版本开始,哈希值很大,很难通过Bruteforce找回密码,而Excel 2010的哈希值是2个字节,可以被大约65536次尝试找到密码。
Excel 2010工作表保护方法
为了保护工作表,密码的哈希值存储在相应工作表名称的xlm文件中,而哈希值存储在workbook.xml文件中,以保护整个工作簿。
以下是密码1表“ 123456789”受保护时存储的哈希值。(在文件xl / worksheets / sheet1.xml中)
为什么变成了9690?这是用了某种哈希算法F来进行转换的
比如:F("123456789") = "9690"
如果F是一种成熟的哈希算法,几乎没有冲突,那就很难找到一个合适的碰撞点,但是
由于某种原因,表格的保护方法必须弱于主表加密,所以这种加密,可以非常容易碰撞到相同的"9690"这个值,但是密码肯定和你原来的不一样,但是可以正常使用
这种加密方式就不再介绍了,网上有很多vba脚本
Excel 2013工作表保护方法
作为哈希算法,使用了Sha2类型的Sha512,因此哈希值是512位(= 64字节),并且使用了salt,因此即使使用Rainbow表(预先计算了哈希值的表),也无济于事。
哈希值的计算如下。
hashValue = sha256(密码||盐)
由于salt值为24个字符,因此如果创建哈希表,则约为24 * 8 = 192位。
下面看具体操作
把你的xlsx文件,修改成后缀为zip,找到文件 xl\worksheets\sheet1.xml
提取加密信息hashValue和saltValue(一般在2013中才会用到这么强的加密)
下面是找回保护当前工作表密码的完整代码,请跑一下,感受一下速度
之所以慢,是因为那十万次迭代
#! /usr/bin/env python 2.7.11
#coding=utf-8
#本脚本改造成opencl,使用NVIDIA GeForce GTX 750 Ti来全速测试,每秒仅能达到500H /s
import hashlib
from base64 import b64encode, b64decode
import struct
workbookAlgorithmName="SHA-512"
workbookHashValue="nx9HCR+xJ8Mkgdon2xwZ4QRJxCdluc5mbfkDyy4PS05BaOP8vfUrvvaV/9A++i0kdPLdCk01tDT84jomvoh5sA=="
workbookSaltValue="Hby4xyZo7dYNNHwQTF0vWA=="
workbookSpinCount="100000"
def findpassword(password):
alg = workbookAlgorithmName.replace('-', '').lower()
if alg not in hashlib.algorithms:
raise Exception("Algorithm %s not in %r" % (alg, hashlib.algorithms))
alg = getattr(hashlib, alg)
count = int(workbookSpinCount)
digests = []
salt = workbookSaltValue
salt = b64decode(salt)
m = alg()
m.update(salt) # data is binary, length = 16
m.update(password.encode('utf-16-le')) # window's "unicode" encoding
h = m.digest()
#这里的十万次迭代循环加密,能慢到吐血
#平时加密和取消密码,时间很短暂,几乎很难感觉到,但对爆破却是致命的打击
for i in xrange(count):
m = alg()
m.update(h)
m.update(struct.pack("
h = m.digest()
digest = b64encode(h)
print digest
print "log:", digest, u"密码找到了" if digest == workbookHashValue else u"密码不正确"
if __name__ == '__main__':
#这里可以使用字典
findpassword("bugscaner")那么,你准备好放弃了吗?