如何将python urandom转换为字符串?

h9a6wy2h  于 2023-06-25  发布在  Python
关注(0)|答案(6)|浏览(122)

如果调用os.urandom(64),我得到64个随机字节。关于Convert bytes to a Python string,我尝试过

a = os.urandom(64)
a.decode()
a.decode("utf-8")

但是得到了指出字节不在UTF-8中的追溯错误。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 0: invalid start byte

用字节

b'\x8bz\xaf$\xb6\x93q\xef\x94\x99$\x8c\x1eO\xeb\xed\x03O\xc6L%\xe70\xf9\xd8
\xa4\xac\x01\xe1\xb5\x0bM#\x19\xea+\x81\xdc\xcb\xed7O\xec\xf5\\}\x029\x122
\x8b\xbd\xa9\xca\xb2\x88\r+\x88\xf0\xeaE\x9c'

是否有一个完整的方法来解码这些字节为某种字符串表示?我正在生成sudo随机令牌来跟踪跨多个数据库引擎的相关文档。

k10s72fa

k10s72fa1#

下面的代码可以在Python 2.7和Python 3上运行:

from base64 import b64encode
from os import urandom

random_bytes = urandom(64)
token = b64encode(random_bytes).decode('utf-8')
6za6bjd0

6za6bjd02#

你有随机字节;如果这是一个字符串可以解码的话我会非常惊讶的。
如果你have有一个unicode字符串,从Latin-1解码:

a.decode('latin1')

因为它将字节一对一Map到相应的Unicode代码点。

5hcedyr0

5hcedyr03#

您可以使用base-64编码。在这种情况下:

a = os.urandom(64)
a.encode('base-64')

还要注意的是,我在这里使用的是encode,而不是decode,因为decode试图将其从您指定的任何格式转换为unicode。因此,在示例中,您将随机字节视为形成有效的utf-8字符串,而随机字节很少出现这种情况。

ql3eal8s

ql3eal8s4#

您确定需要64个字节表示为字符串吗?
也许你真正需要的是N位令牌?如果是,请使用secrets。秘密模块提供用于生成安全令牌的功能,适用于诸如密码重置、难以猜测的URL等应用。

import secrets

>>> secrets.token_bytes(16)  
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'

>>> secrets.token_hex(16)  
'f9bf78b9a18ce6d46a0cd2b0b86df9da'

>>> secrets.token_urlsafe(16)  
'Drmhze6EPcv0fN_81Bj-nA'

或者也许你需要64个字符长度的随机字符串?导入字符串

import secrets
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(64))
uplii1fm

uplii1fm5#

这个简单的方法:

a = str(os.urandom(64))
print(F"the: {a}")
print(type(a))
voase2hg

voase2hg6#

当尝试使用urandom(16)的编解码器进行编码/解码时,我会得到UnicodeDecodeError: 'utf-8' codec can't decode byte 0xed in position 0: invalid continuation byte
这就是我最后做的。

import os
import binascii

a = binascii.hexlify(os.urandom(32)).decode()
print(a)

'fd78f19c8bdcd7bc086d5a34b8d0ebccbd501fd2eea18e46699bb52efa48ac3c'

相关问题