如何在CSV等文本格式文件中有效存储二进制数据?
二进制密码哈希存储到CSV的实现方案
- 不要使用
str(storage)强制转换bytes对象,该方式生成的是bytes的打印表达字符串,包含大量转义字符和冗余标识,无法稳定还原原始二进制数据,是错误的实现思路。 - 正确方案为使用Python标准库
base64做二进制和可打印字符串的编解码,这是工业界通用的二进制文本化存储标准,数据无损耗、长度固定、兼容所有文本存储场景。
完整代码示例
写入CSV的逻辑
import os import hashlib import base64 import csv # 原有哈希生成逻辑保持不变 salt = os.urandom(64) hash_val = hashlib.pbkdf2_hmac( 'sha256', password.encode('utf-8'), salt, 1000000 ) storage = salt + hash_val # 新增Base64编码逻辑,转成可存储的ASCII字符串 storage_str = base64.b64encode(storage).decode('ascii') # 写入CSV文件 with open('passwd_store.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) # 可按业务需求自定义列,示例为用户名+对应存储串 writer.writerow(['test_user', storage_str])
读取校验的逻辑
with open('passwd_store.csv', 'r', encoding='utf-8') as f: reader = csv.reader(f) for row in reader: user_name, storage_str = row # Base64解码还原原始二进制数据 storage = base64.b64decode(storage_str) # 后续校验逻辑和内存中运行的逻辑完全一致 salt_from_store = storage[:64] hash_from_store = storage[64:] # 接下来做密码校验即可
补充说明
- 也可以分别对salt和hash做Base64编码,存为CSV的两个独立字段,编解码逻辑和上述方案一致
- 不需要额外做二进制转整数再还原的操作,Base64的性能和可靠性已经完全满足需求
- 该方案生成的存储字符串长度固定为172位(128字节原始数据Base64编码后固定为172字符),不存在长度不稳定的问题
内容的提问来源于stack exchange,提问作者Xarvveron
相关产品推荐
相关产品推荐

