User.objects.make_random_password()
当用户到达场地时,他们将出示密码。
可以安全地假设两个人不会使用相同的代码吗?
谢谢。
User.objects.make_random_password()
当用户到达场地时,他们将出示密码。
可以安全地假设两个人不会使用相同的代码吗?
谢谢。
User.objects.make_random_password()
。对于默认值,我认为几乎没有机会;
此方法是使用get_random_string()
实现的。参考django github repo:
def get_random_string(length=12,
allowed_chars='abcdefghijklmnopqrstuvwxyz'
'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'):
"""
Returns a securely generated random string.
The default length of 12 with the a-z, A-Z, 0-9 character set returns
a 71-bit value. log_2((26+26+10)^12) =~ 71 bits
"""
if not using_sysrandom:
# This is ugly, and a hack, but it makes things better than
# the alternative of predictability. This re-seeds the PRNG
# using a value that is hard for an attacker to predict, every
# time a random string is required. This may change the
# properties of the chosen random sequence slightly, but this
# is better than absolute predictability.
random.seed(
hashlib.sha256(
"%s%s%s" % (
random.getstate(),
time.time(),
settings.SECRET_KEY)
).digest())
return ''.join([random.choice(allowed_chars) for i in range(length)])
根据Github,当前代码默认使用62个字符(大小写字母和数字)的字符串中的12个字符作为密码。这样可以生成62**12或3226266762397899821056(3.22e21)种不同的密码。这比当前世界人口(约7e9)要多得多。
字母是通过random.choice()
函数从此字符列表中选择的。现在的问题是,重复调用random.choice()
返回相同序列的可能性有多大?
正如您从get_random_string()
的实现中所看到的那样,该代码会尽力避免可预测性。当不使用操作系统的伪随机值生成器(在Linux和*BSD上从例如以太网数据包或按键到达的时间中收集真正的随机性)时,它会在每次调用时使用当前随机状态、当前时间和(可能是常数的)秘密密钥的组合重新播种random
模块的Mersenne Twister可预测PRNG。
因此,要生成两个相同的密码,必须使随机生成器的状态(在Python中约为8 kiB)和生成它们的时间(以自纪元以来的秒数表示,如time.time()
)完全相同。如果系统的时间得到良好维护并且您正在运行一个密码生成程序的实例,则发生这种情况的可能性基本为零。如果您同时启动两个或更多个密码生成程序的实例,并且使用PRNG的完全相同的种子组合它们的输出,则可以预期某些密码会出现多次。