Python:使用已知字符制作暴力哈希检查器
Python: Making a Brute Force Hash Checker with Known Characters
我已经创建了一个相当简单的程序来暴力破解指定类型的哈希,能够将已知字符附加到它的开头。
import datetime
import hashlib
import itertools
characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
def checkHashes(targetHash, unhashedStringLength, hashType, discovered):
print("Start = " + str(datetime.datetime.now()))
typeOfHash = getattr(hashlib, hashType)
for trialString in itertools.product(characters, repeat=unhashedStringLength-len(discovered)):
s = discovered + "".join(trialString)
if(typeOfHash(s.encode('utf-8')).hexdigest() == targetHash):
print("Finish = " + str(datetime.datetime.now()))
return s
也就是说,我目前无法解决其中包含已知字符的散列。例如,如果我将 "AB234***ANS*34" 呈现给我,其中“*”是未知字符,我将无法告诉程序我知道的不仅仅是前五个字符。有没有什么办法可以在不减慢进程的情况下暴力破解一串已知和未知的字符?另外,如果我可以做些什么来使程序 运行 更高效,我非常乐意接受建议。
抱歉,如果我的措辞令人困惑。如果您需要任何澄清,请询问!
您可以在 product()
的参数中穿插固定和可变部分。例如,使用您的 "AB234***ANS*34"
示例,但使用更小的字符集以使输出更短(4 个通配符中的每一个可能有 2 个字符 = 2**4 = 16):
from itertools import product
characters = "xy"
template = [["AB234"],
characters, characters, characters,
["ANS"],
characters,
["34"]]
for trialString in product(*template):
s = "".join(trialString)
print(s)
显示 16 种可能性:
AB234xxxANSx34
AB234xxxANSy34
AB234xxyANSx34
AB234xxyANSy34
AB234xyxANSx34
AB234xyxANSy34
AB234xyyANSx34
AB234xyyANSy34
AB234yxxANSx34
AB234yxxANSy34
AB234yxyANSx34
AB234yxyANSy34
AB234yyxANSx34
AB234yyxANSy34
AB234yyyANSx34
AB234yyyANSy34
就product()
而言,像["AB234"]
这样的东西是一个只有一个元素的序列,所以它returns.[=16的每个产品中都包含这个元素=]
至于效率,任务本质上是指数时间的。没有什么能让它变得更快。工业级破解者为了低级速度求助于汇编程序,并将任务分散到尽可能多的 CPU 上 运行 ;-)
我已经创建了一个相当简单的程序来暴力破解指定类型的哈希,能够将已知字符附加到它的开头。
import datetime
import hashlib
import itertools
characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
def checkHashes(targetHash, unhashedStringLength, hashType, discovered):
print("Start = " + str(datetime.datetime.now()))
typeOfHash = getattr(hashlib, hashType)
for trialString in itertools.product(characters, repeat=unhashedStringLength-len(discovered)):
s = discovered + "".join(trialString)
if(typeOfHash(s.encode('utf-8')).hexdigest() == targetHash):
print("Finish = " + str(datetime.datetime.now()))
return s
也就是说,我目前无法解决其中包含已知字符的散列。例如,如果我将 "AB234***ANS*34" 呈现给我,其中“*”是未知字符,我将无法告诉程序我知道的不仅仅是前五个字符。有没有什么办法可以在不减慢进程的情况下暴力破解一串已知和未知的字符?另外,如果我可以做些什么来使程序 运行 更高效,我非常乐意接受建议。
抱歉,如果我的措辞令人困惑。如果您需要任何澄清,请询问!
您可以在 product()
的参数中穿插固定和可变部分。例如,使用您的 "AB234***ANS*34"
示例,但使用更小的字符集以使输出更短(4 个通配符中的每一个可能有 2 个字符 = 2**4 = 16):
from itertools import product
characters = "xy"
template = [["AB234"],
characters, characters, characters,
["ANS"],
characters,
["34"]]
for trialString in product(*template):
s = "".join(trialString)
print(s)
显示 16 种可能性:
AB234xxxANSx34
AB234xxxANSy34
AB234xxyANSx34
AB234xxyANSy34
AB234xyxANSx34
AB234xyxANSy34
AB234xyyANSx34
AB234xyyANSy34
AB234yxxANSx34
AB234yxxANSy34
AB234yxyANSx34
AB234yxyANSy34
AB234yyxANSx34
AB234yyxANSy34
AB234yyyANSx34
AB234yyyANSy34
就product()
而言,像["AB234"]
这样的东西是一个只有一个元素的序列,所以它returns.[=16的每个产品中都包含这个元素=]
至于效率,任务本质上是指数时间的。没有什么能让它变得更快。工业级破解者为了低级速度求助于汇编程序,并将任务分散到尽可能多的 CPU 上 运行 ;-)