【问题标题】:Why does using this code can generate a random password?为什么使用此代码可以生成随机密码?
【发布时间】:2019-06-04 23:31:10
【问题描述】:

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

  1. urandom(6),来自urandom的帮助说,返回n个适合加密使用的随机字节,也就是说,它将返回6个字节,是ASCII的6个吗?

  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))

【问题讨论】:

    标签: python random cryptography passwords


    【解决方案1】:

    urandom 将返回一个字节(即 0 到 255 之间的值)。示例代码使用该值和模运算符 (%) 将其转换为 0 到 22 之间的值,以便它可以返回 23 个字母之一(IOQ 是排除不要与数字混淆)。

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

    【讨论】:

    • 非常感谢 Selcuk 的详细信息和快速解释,非常有用!
    【解决方案2】:

    ord() 函数接受一个包含单个字符的字符串,并返回其 Unicode 索引。

    例如。

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

    它不是用来获取你提到的字节的十进制基数,而是它的 Unicode 索引(它在 Unicode 表中的位置)。

    附注:- 虽然它返回了 Unicode 索引,但这并不意味着它的 range = len(Unicode Table) ,原因是你的 python 编译器在正常情况下可能不支持这么长的字符集。

    【讨论】:

      猜你喜欢
      • 2021-10-17
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 2012-08-07
      • 2014-12-27
      相关资源
      最近更新 更多