首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中生成nonce的标准方法是什么?

在Python中生成nonce的标准方法是什么?
EN

Stack Overflow用户
提问于 2011-04-08 11:41:16
回答 5查看 29.1K关注 0票数 22

有人能分享一下在Python语言中为OAuth请求创建现时值的最佳实践吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-01-28 15:01:44

python-oauth2是如何做到这一点的:

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

它们还具有:

代码语言:javascript
复制
@classmethod
def make_nonce(cls):
    """Generate pseudorandom number."""
    return str(random.randint(0, 100000000))

此外,还有一个标题为"make_nonce is not random enough“的问题,它提出:

代码语言:javascript
复制
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)。

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

代码语言:javascript
复制
lambda length: filter(lambda s: s.isalpha(), b64encode(urandom(length * 2)))[:length]
票数 13
EN

Stack Overflow用户

发布于 2016-10-30 19:14:23

对于大多数实际目的,这提供了非常好的nonce:

代码语言:javascript
复制
import uuid
uuid.uuid4().hex
# 'b46290528cd949498ce4cc86ca854173'

uuid4()使用os.urandom(),这是你在Python语言中能得到的最好的随机函数。

Nonce应该是只使用一次很难预测。请注意,uuid4()uuid1()更难预测,而后者更具全局唯一性。因此,您可以通过组合它们来获得更大的优势:

代码语言:javascript
复制
uuid.uuid4().hex + uuid.uuid1().hex
# 'a6d68f4d81ec440fb3d5ef6416079305f7a44a0c9e9011e684e2c42c0319303d'
票数 15
EN

Stack Overflow用户

发布于 2019-01-25 07:04:00

虽然在创建这个问题时这可能还不存在,但Python3.6引入了secrets模块,该模块用于生成适合管理数据的加密强随机数,例如密码、帐户身份验证、安全令牌和相关秘密。

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

代码语言:javascript
复制
nonce = secrets.token_urlsafe()

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

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5590170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档