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

cha*_*ath 15 python authentication oauth nonce

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

gab*_*uzo 14

虽然在创建此问题时这可能不存在,但 Python 3.6 引入了secrets模块,该模块旨在生成适用于管理密码、帐户身份验证、安全令牌和相关机密等数据的加密强随机数

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

nonce = secrets.token_urlsafe()
Run Code Online (Sandbox Code Playgroud)

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


A T*_*A T 9

以下是python-oauth2的用法:

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

他们还有:

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

此外,还有一个题为" make_nonce不够随机 "的问题,提出:

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()
Run Code Online (Sandbox Code Playgroud)

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

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

lambda length: filter(lambda s: s.isalpha(), b64encode(urandom(length * 2)))[:length]
Run Code Online (Sandbox Code Playgroud)

  • "[nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce)"是密码学家发明的一个词,需要一个新单词来明确表示"一个人无法猜测的价值"(实际上,一个足够大的密码学安全随机整数).他们在协议中以许多创造性的方式使用它们,并且始终假设没人能猜出它们.`random.randint`很容易让坏人猜测,危及安全性.https://www.cigital.com/papers/download/developer_gambling.php (2认同)

and*_*uso 7

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

import uuid

uuid.uuid4().hex
# '12b90b6ffc0e46f788a26f1a6dc246fc'
Run Code Online (Sandbox Code Playgroud)

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

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

uuid.uuid4().hex + uuid.uuid1().hex
# 'a6d68f4d81ec440fb3d5ef6416079305f7a44a0c9e9011e684e2c42c0319303d'
Run Code Online (Sandbox Code Playgroud)