python - 如何在Python中将字节转换为相同长度的字符串(每个字节1个字符)?
问题描述
我需要一个随机字符串,我可以写下来用于哈希函数中的盐。我可以生成一些随机字节并将它们视为十六进制:
import os, binascii
print(binascii.b2a_hex(os.urandom(32)))
b'76449cd6134d64353122102fcb512d1eae1bd8437202b6e06e91a422ce9e386b' # 64 chars
太好了,但是如何将这些字节直接转换为字符串,即不一定可打印,但正好是 32 个字符?哈希函数需要一个字符串,而不是最大长度为 32 的“字节”类型。
我不确定如何在 Python 中进行编码,但我想我需要类似于旧的 8 位计算机或 C 程序将字节转换为字符(ASCII 或其他)的方式。
这是 Django 的 make_password 函数的盐输入。
解决方案
您可以使用chr
并加入他们:
>>> s = ''.join(map(chr, os.urandom(32)))
>>> print(len(s), s)
32 ^Ô¸ÒÜì<ù³B_¶t¶Ùj)"×Ï‚ž™Të$)
或者decode
让我们说 latin1:
>>> s = os.urandom(32).decode('latin1')
>>> print(len(s), s)
32 ùLÖ]ù²ì¥Ý.b#AÎ+Ûê+9'Za37
如果您确实需要通过这样一个长度为 64 的十六进制字符串,只需先将其取消十六进制:
>>> b = b'76449cd6134d64353122102fcb512d1eae1bd8437202b6e06e91a422ce9e386b'
>>> s = binascii.a2b_hex(b).decode('latin1')
>>> print(len(s), s)
32 vDÖMd51"/ËQ-®ØCr¶àn¤"Î8k
或者从随机的 32 个字节开始,将它们十六进制显示并解码它们(没有十六进制+非十六进制)以供使用:
>>> b = os.urandom(32)
>>> binascii.b2a_hex(b)
b'5751b7bfe1a3ea50c9f8143d64f4ce07a05a21805c976536147114dab27ee08c'
>>> s = b.decode('latin1')
>>> print(len(s), s)
32 WQ·¿á£êPÉø=dôÎ Z!\e6qÚ²~à
推荐阅读
- amazon-web-services - 如何在 AWS ECS 集群中运行的 springBoot 应用程序中获取 containerId 或容器名称
- node.js - 使用 MongoDB 存储通知(连同读取状态)
- jsf - 在 JSF 页面中显示 Power Bi 仪表板
- c# - 将多个实体写入数据库时哪个更快:Add() 循环添加每个项目或 AddRange() 添加对象列表?
- java - HashSet 内部使用 HashMap。在 HashMap 中,如果我们尝试放入相同的键,则会覆盖先前的值
- bash - 如何编写一个bash脚本代码来显示当月的星期六和星期日的日期
- r - 使用基础 R 进行过滤和排序不起作用
- c - 在 docker 容器中使用 membarrier
- angular - 无法在角度服务中的 Observable 中使用 Promise
- java - Git 子模块和包