有人可以分享在Python中为OAuth请求创建nonce的最佳做法吗?
答案 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获得十六进制字符串。