MT3C Cracking Sha1-Hashed passwords
题目
cracking-sha1-hashed-passwords
Cracking Sha1-Hashed passwords
已知 password 经过 sha1-hash 后的值和键盘输入痕迹,破解密码
解析
知识点
-
SHA-1
(Secure Hash Algorithm 1)是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦资料处理标准(FIPS)。SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。
分析
根据键盘上的指纹痕迹,我们可以判断密码所包含的字符
['q', 'Q', 'w', 'W', 'n', 'N', 'i', 'I', '+', '*', '5', '%', '8', '(', '0', '=']
,以及最小的密码长度为8
,注意到小键盘上只有 2468 有痕迹,很有可能代表上下左右。 穷举即可,从所有字符串中选出密码长度个(可重复)字符,组成密码,进行 sha1 运算,结果与给定的密码 sha1-value 相比较,相同即可得到答案。
product
是 Python 标准库中itertools
模块中的一个函数。它用于计算多个可迭代对象的笛卡尔积。简而言之,product
返回所有可能的组合,其中每个组合由输入的可迭代对象中的一个元素组成。Itertools.Product (*iterables, repeat=1)
1.*iterables
:这是一个可变参数,你可以传递一个或多个可迭代对象作为参数。这些可迭代对象的元素将被用来生成组合。 2.repeat
:这是一个可选参数,默认值为1
。它表示每个输入可迭代对象要重复使用的次数。如果设置为大于 1 的值,生成的组合中的每个元素都会在输出中重复多次。
解决方案
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# -*- coding: utf-8 -*-
import hashlib
import itertools
def is_equal(c):
return hashlib.sha1(c.encode('utf8')).hexdigest() == '67ae1a64661ac8b4494666f58c4822408dd0a3e4'
def main():
k = '(Q=Win5qw80IN*%'
for i in range(8, 20):
keys = itertools.permutations(k, i)
for key in keys:
c = ''.join(key)
if is_equal(c):
print("The password is :", c)
return
if __name__ == '__main__':
main()
运行结果
1
The password is : (Q=win*5
参考
本文由作者按照 CC BY 4.0 进行授权