为什么使用此代码可以生成随机密码?
Why does using this code can generate a random password?
这里是生成密码代码的片段,
我对此有2个问题,你能分享一下如何理解吗?
urandom(6)
,help from urandom said,returnn random bytes suitable for cryptographic use,据说,会return6字节,是吗6 个 ASCII 码?
ord(c)
,获取上述字节的十进制数,这里为什么转十进制数?
帮助urandom
:
def urandom(n): # real signature unknown; restored from __doc__
"""
urandom(n) -> str
Return n random bytes suitable for cryptographic use.
"""
return ""
Python 脚本:
from os import urandom
letters = "ABCDEFGHJKLMNPRSTUVWXYZ"
password = "".join(letters[ord(c) % len(letters)] for c in urandom(6))
urandom
将 return 一个字节(即 0 到 255 之间的值)。示例代码使用该值和模运算符 (%
) 将其转换为 0 到 22 之间的值,这样它就可以 return 23 个字母之一 (I
, O
和 Q
被排除在外,以免与数字混淆)。
请注意,它不是一个完美平衡的算法,因为它更倾向于前 3 个字母(A
、B
和 C
),因为 256 不能被整除23 和 256 % 23
是 3
。
ord()
函数接受一个包含单个字符的字符串,returns 它的 Unicode 索引。
例如。
ord("A") => 65
ord("£") => 163
它并不像您提到的那样用于获取字节的十进制基数,而是用于获取其 Unicode 索引(它在 Unicode Table 中的位置)。
P.S。 :- 尽管它 returns Unicode 索引但这并不意味着它的 range = len(Unicode Table) ,原因是你的 python 编译器可能一般情况下不支持这么长的字符集
这里是生成密码代码的片段, 我对此有2个问题,你能分享一下如何理解吗?
urandom(6)
,help from urandom said,returnn random bytes suitable for cryptographic use,据说,会return6字节,是吗6 个 ASCII 码?ord(c)
,获取上述字节的十进制数,这里为什么转十进制数?
帮助urandom
:
def urandom(n): # real signature unknown; restored from __doc__
"""
urandom(n) -> str
Return n random bytes suitable for cryptographic use.
"""
return ""
Python 脚本:
from os import urandom
letters = "ABCDEFGHJKLMNPRSTUVWXYZ"
password = "".join(letters[ord(c) % len(letters)] for c in urandom(6))
urandom
将 return 一个字节(即 0 到 255 之间的值)。示例代码使用该值和模运算符 (%
) 将其转换为 0 到 22 之间的值,这样它就可以 return 23 个字母之一 (I
, O
和 Q
被排除在外,以免与数字混淆)。
请注意,它不是一个完美平衡的算法,因为它更倾向于前 3 个字母(A
、B
和 C
),因为 256 不能被整除23 和 256 % 23
是 3
。
ord()
函数接受一个包含单个字符的字符串,returns 它的 Unicode 索引。
例如。
ord("A") => 65
ord("£") => 163
它并不像您提到的那样用于获取字节的十进制基数,而是用于获取其 Unicode 索引(它在 Unicode Table 中的位置)。
P.S。 :- 尽管它 returns Unicode 索引但这并不意味着它的 range = len(Unicode Table) ,原因是你的 python 编译器可能一般情况下不支持这么长的字符集