我正在实现一个密码生成器,它根据服务名称和主密码创建密码。为此,主密码和服务被哈希。现在我只有小写字母和数字。我怎么能包括大写字母和特殊符号?
我找到了以下代码,这似乎解决了这个问题。我应该使用它以及它究竟做了什么?
raw_hexdigest = make_password(plaintext, service)
# Convert the hexdigest into decimal
num = int(raw_hexdigest, 16)
# What base will we convert `num` into?
num_chars = len(alphabet)
# Build up the new password one "digit" at a time,
# up to a certain length
chars = []
while len(chars) < length:
num, idx = divmod(num, num_chars)
chars.append(alphabet[idx])
return ''.join(chars)
答案 0 :(得分:0)
首先,请注意散列密码作为整数键返回。您返回的密码只是以某个基数表示的整数,给定的alphabet
。问题的关键是你提供的alphabet
。
对于基数10,字母表为“01234356789”;对于十六进制,它是“01234356789ABCDEF”。您似乎使用了36:10位数和26个小写字母。
要展开此功能,只需将alphabet
指定为密码中所需的字符即可。
更详细地说,底部的循环是逐位的基本转换。 base
是字母表的长度。在每次迭代时,循环使用divmod
将密钥整数拆分为该基数(idx
)中的“单位”值和商,即整数的其余部分。然后它从字母表中选择相应的字符并将其附加到最终成为密码的字符串。
我建议您插入一些策略性的print
语句并观察其运行情况......可能在10号基数中,然后是16.而不是调用make_password
,只需将键设置为您认可的内容好吧,比如
raw_hexdigest = 1024 + 256 + 4 + 1
从那里开始,观察如何通过各种字母表处理这个数字。