简介

在做密码存储的时候,我遇到了三种常见的数据表示方式:SHA256Base64Uint8Array(简称 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 个?原因如下:

    1. Base64 按 每 3 个字节(24 位)为一组 来编码,每组会生成 4 个 Base64 字符。

    2. SHA256 输出 32 字节 → 可以分为 10 组完整的 3 字节 + 剩余 2 字节

    3. 剩余 2 字节会生成 3 个 Base64 字符,最后用 = 填充到 4 个字符。

    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(可解码回原始二进制)


总结对比

类型单位用途可读性大小
SHA256256 bit安全哈希、数据完整性固定 32 字节
Base646 bit/字符展示、传输、压缩长度44 字符(填充)
Uint8Array8 bit/字节内存操作、加密运算32 字节