简介
在做密码存储的时候,我遇到了三种常见的数据表示方式:SHA256、Base64 和 Uint8Array(简称 Uint8)。它们各有用途和特点,于是写下这篇文章来总结一下。
SHA256
SHA256 是现代互联网广泛使用的加密哈希算法,例如在区块链、密码存储和数据完整性验证中都很常见。
特点:
将任意长度的输入数据经过数学运算后,输出 256 位二进制数(32 字节)。
几乎不可逆,意味着即使拿到 SHA256 的输出,也很难反推出原始输入。
示例输出(以十六进制表示):
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855缺点:可读性差,尤其是在前端需要显示或传输时不方便。
因此,通常会配合 Base64 或十六进制表示来方便存储和展示。
Base64
Base64 是一种将二进制数据编码为可打印 ASCII 字符的方式。
特点:
每 6 位二进制数映射为一个字符,字符集包含:
A-Z, a-z, 0-9, +, /以及
=用作填充,使长度为 4 的倍数。可以将 SHA256 的 32 字节(256 位)输出编码为 44 个 Base64 字符。
为什么是 44 个而不是 43 个?原因如下:
Base64 按 每 3 个字节(24 位)为一组 来编码,每组会生成 4 个 Base64 字符。
SHA256 输出 32 字节 → 可以分为 10 组完整的 3 字节 + 剩余 2 字节。
剩余 2 字节会生成 3 个 Base64 字符,最后用
=填充到 4 个字符。总长度 = 10×4 + 4 = 44
示例输出(Base64 编码):
47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=优点:长度更短、可读性高、适合前端显示和传输。
Uint8Array(Uint8)
Uint8Array 是 JavaScript 中的 字节数组类型。
特点:
每个元素占用 8 位(1 字节)
用于存储原始二进制数据,例如 SHA256 输出、文件、加密密钥等
与 Base64 不同,它不是为了显示,而是为了高效存储和计算
示例:
const hash = new Uint8Array([227, 176, 196, 66, 152, 252, ...]);与 Base64 的转换:
SHA256 输出 → Uint8Array → Base64(可显示)
Base64 → Uint8Array(可解码回原始二进制)
总结对比
| 类型 | 单位 | 用途 | 可读性 | 大小 |
|---|---|---|---|---|
| SHA256 | 256 bit | 安全哈希、数据完整性 | 差 | 固定 32 字节 |
| Base64 | 6 bit/字符 | 展示、传输、压缩长度 | 高 | 44 字符(填充) |
| Uint8Array | 8 bit/字节 | 内存操作、加密运算 | 低 | 32 字节 |