为什么使用此代码可以生成随机密码?

Why does using this code can generate a random password?

这里是生成密码代码的片段, 我对此有2个问题,你能分享一下如何理解吗?

  1. urandom(6),help from urandom said,returnn random bytes suitable for cryptographic use,据说,会return6字节,是吗6 个 ASCII 码?

  2. 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, OQ 被排除在外,以免与数字混淆)。

请注意,它不是一个完美平衡的算法,因为它更倾向于前 3 个字母(ABC),因为 256 不能被整除23 和 256 % 233

ord() 函数接受一个包含单个字符的字符串,returns 它的 Unicode 索引。

例如。

ord("A") => 65
ord("£") => 163

它并不像您提到的那样用于获取字节的十进制基数,而是用于获取其 Unicode 索引(它在 Unicode Table 中的位置)。

P.S。 :- 尽管它 returns Unicode 索引但这并不意味着它的 range = len(Unicode Table) ,原因是你的 python 编译器可能一般情况下不支持这么长的字符集