在Python中生成随机数的标准方法是什么?

时间:2011-04-08 03:41:16

标签: python authentication oauth nonce

有人可以分享在Python中为OAuth请求创建nonce的最佳做法吗?

5 个答案:

答案 0 :(得分:9)

以下是python-oauth2的用法:

def generate_nonce(length=8):
    """Generate pseudorandom number."""
    return ''.join([str(random.randint(0, 9)) for i in range(length)])

他们也有:

@classmethod
def make_nonce(cls):
    """Generate pseudorandom number."""
    return str(random.randint(0, 100000000))

此外还有一个题为“make_nonce is not random enough”的问题,建议:

def gen_nonce(length):
   """ Generates a random string of bytes, base64 encoded """
   if length < 1:
      return ''
   string=base64.b64encode(os.urandom(length),altchars=b'-_')
   b64len=4*floor(length,3)
   if length%3 == 1:
      b64len+=2
   elif length%3 == 2:
      b64len+=3
   return string[0:b64len].decode()

还引用了CVE-2013-4347。 TL; DR版本,使用os.urandom或其抽象接口(SystemRandom)。

我喜欢我的lambda s - 并且不想要非字母数字字符 - 所以我使用了这个:

lambda length: filter(lambda s: s.isalpha(), b64encode(urandom(length * 2)))[:length]

答案 1 :(得分:6)

Nonce应该只使用一次难以预测

import uuid

uuid.uuid4().hex
# '12b90b6ffc0e46f788a26f1a6dc246fc'

uuid4()使用os.urandom(),这是你可以在python中获得的最佳随机数。

请注意,uuid4()uuid1()更难预测,而后来更具全球唯一性。您可以将两者连接起来以实现两个目标:

uuid.uuid4().hex + uuid.uuid1().hex
# 'a6d68f4d81ec440fb3d5ef6416079305f7a44a0c9e9011e684e2c42c0319303d'

答案 2 :(得分:4)

这是rauth的作用。这里没有真正严格的规则。规范似乎没有太过自以为是。您的约束是作为nonce的值应该是唯一的。除此之外,假设提供者没有抱怨,你可以使用你喜欢的任何方法。

答案 3 :(得分:1)

以下是我为电子邮件提供的一些想法。 generate_nonce来自他们的代码,但我使用的是generate_nonce_timestamp,我使用了uuid。它给我一个随机的字母数字字符串和一个时间戳,以秒为单位:

import random
import time
import uuid


def generate_nonce(length=8):
    """Generate pseudo-random number."""
    return ''.join([str(random.randint(0, 9)) for i in range(length)])


def generate_timestamp():
    """Get seconds since epoch (UTC)."""
    return str(int(time.time()))

def generate_nonce_timestamp():
    """Generate pseudo-random number and seconds since epoch (UTC)."""
    nonce = uuid.uuid1()
    oauth_timestamp, oauth_nonce = str(nonce.time), nonce.hex
    return oauth_nonce, oauth_timestamp

我喜欢使用uuid1,因为它根据当前的主机和时间生成uuid,并且如果需要,可以提取时间属性。对于电子邮件,您需要时间戳和随机数。

这是你得到的:

>>> generate_nonce_timestamp()
('a89faa84-6c35-11e5-8a36-080027c336f0', '136634341422770820')

如果您要删除-,请使用nonce.get_hex()

uuid1 - 从主机ID,序列号和当前时间生成UUID。 更多关于uuid

答案 4 :(得分:0)

尽管在创建问题时可能不存在此功能,但Python 3.6引入了secrets模块,该模块的意思是用于生成适用于管理数据(例如密码,帐户身份验证,安全令牌和相关机密

在这种情况下,可以很容易地生成随机数(这里是base64编码的字符串):

<ion-item>
<ion-scroll  class="data-scroll">
    <table  class="data-table">
        <tr>
            <td *ngFor="let row of headerRow; let i = index" text-center><b> {{ row }} </b></td>
          </tr>    
          <tr *ngFor="let row of csvData; let i = index">
            <td *ngFor="let data of row; let j = index; trackBy: trackByFn">
              <ion-input type="text" [(ngModel)]="csvData[i][j]"></ion-input>
            </td>
        </table>
      </ion-scroll>   

替代方法是token_bytes获得二进制令牌,或者token_hex获得十六进制字符串。