如何在python中创建一个加密安全的随机数?

 手机用户2502941011 发布于 2023-02-06 13:44

我在python中创建一个项目,我想创建一个加密安全的随机数,我该怎么做?我在网上看到,常规随机数生成的数字不具有加密安全性,并且该函数os.urandom(n)返回一个字符串,而不是数字.

4 个回答
  • 你可以ord通过在返回的字节上应用函数来获得随机数列表os.urandom,就像这样

    >>> import os
    >>> os.urandom(10)
    'm\xd4\x94\x00x7\xbe\x04\xa2R'
    >>> type(os.urandom(10))
    <type 'str'>
    >>> map(ord, os.urandom(10))
    [65, 120, 218, 135, 66, 134, 141, 140, 178, 25]
    

    引用os.urandom文档,

    返回一串适合加密使用n随机字节.

    此函数从特定于OS的随机源返回随机字节.对于加密应用程序,返回的数据应该是不可预测的,尽管其确切的质量取决于操作系统的实现.在类UNIX系统上,这将查询/dev/urandom,并在Windows上使用CryptGenRandom().

    2023-02-06 13:46 回答
  • Python 3.6引入了一个新的秘密模块,"可以访问操作系统提供的最安全的随机源." 为了生成一些加密安全号码,您可以拨打电话secrets.randbelow().

    secrets.randbelow(n)
    

    这将返回0到0之间的数字n.

    2023-02-06 13:47 回答
  • 由于您希望在某个特定范围内生成整数,因此使用random.SystemRandom该类会更容易.创建该类的实例会为您提供一个对象,该对象支持该random模块的所有方法,但os.urandom()在封面下使用.例子:

    >>> from random import SystemRandom
    >>> cryptogen = SystemRandom()
    >>> [cryptogen.randrange(3) for i in range(20)] # random ints in range(3)
    [2, 2, 2, 2, 1, 2, 1, 2, 1, 0, 0, 1, 1, 0, 0, 2, 0, 0, 0, 0]
    >>> [cryptogen.random() for i in range(3)]  # random floats in [0., 1.)
    [0.2710009745425236, 0.016722063038868695, 0.8207742461236148]
    

    等等.urandom()直接使用,你必须发明自己的算法,将它产生的随机字节转换成你想要的结果.不要这样做;-) SystemRandom为你做.

    请注意这部分文档:

    class random.SystemRandom([seed])

    使用os.urandom()函数从操作系统提供的源生成随机数的类.并非适用于所有系统.不依赖于软件状态和序列是不可重复的.因此,seed()和jumpahead()方法没有效果并被忽略.如果调用,getstate()和setstate()方法会引发NotImplementedError.

    2023-02-06 13:47 回答
  • 如果你想要一个n比特随机数,在Python 2.4+下,我找到的最简单的方法是

    import random
    random.SystemRandom().getrandbits(n)
    

    请注意SystemRandom使用os.urandom(),因此此方法的结果仅与系统的urandom()实现一样好.

    2023-02-06 13:49 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有