You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:12:02