【问题标题】:Convert Bytestring to "normal" String Python将 Bytestring 转换为“普通”字符串 Python
【发布时间】:2020-07-08 05:32:46
【问题描述】:

我正在生成一个 argon2d 哈希,并想将它与我数据库中的哈希字符串进行比较。

对于散列,我使用这个函数:

    import argon2

    argon2Hasher = argon2.hash_password_raw(b"password", b"TESTTESTTESTTEST" ,time_cost=16, memory_cost=512, parallelism=1, hash_len=16,     type=argon2.Type.D) #argon2.low_level.Type.D)
    print(argon2Hasher)

我的输出是:

b'\x0c\xd1\xe3\xf0\x0f\x03<\xa0\xa99\xee\x85I\xc8\xcb\xb0'

我尝试使用 argon2Hasher.decode(encoding="ascii") 导致: UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 1: ordinal not in range(128) 我也用encoding="utf-8" 尝试了相同的命令,但这导致UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd1 in position 1: invalid continuation byte

如何将其转换为纯文本(普通字符串)?

我使用的是 Python 3.6。

【问题讨论】:

    标签: json python-3.x argon2-ffi


    【解决方案1】:

    虽然没有办法告诉确定使用什么编码,但有些编码没有无效值,例如latin1,在你的数据上尝试会产生这样的结果:

    s = b'\x0c\xd1\xe3\xf0\x0f\x03<\xa0\xa99\xee\x85I\xc8\xcb\xb0'
    repr(s.decode('latin1'))
    # "'\\x0cÑãð\\x0f\\x03<\\xa0©9î\\x85IÈ˰'"
    

    codecs 包的文档为您提供了可以为编码指定的内容的完整列表。


    但是,我认为您在问自己一个错误的问题。 如果您显示的bytes 旨在表示一个哈希,那么转换为str 并不是真正可取的,因为当您自己进行试验时,这还必须包括一个要“解释”的编码。 相反,bytesbytes,不需要额外的编码。 这与 hashlib 主要与 bytes 一起使用的原因相同。

    【讨论】:

    • 坚持字节不会有任何问题,但我将其用于 API。我将收到 JSON 对象,当我尝试使用 return jsonify(Hash= argon2_hash("password")) 传递它时,我得到一个“TypeError: Object of type 'bytes' is not JSON serializable”。所以我认为向我发送数据的人必须将其转换为,所以我仍然需要使一侧适应另一侧
    • @CalBlau 你可以序列化repr(bytes) 而不是bytes。那总是一个字符串。
    猜你喜欢
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    相关资源
    最近更新 更多