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获取十六进制字符串。
以下是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应该只使用一次而且难以预测:
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)
| 归档时间: |
|
| 查看次数: |
17762 次 |
| 最近记录: |