OpenSSL RAND_bytes 完整原理:从硬件熵到密码学安全随机数

OpenSSL RAND_bytes 完整原理 从操作系统的硬件中断到你代码里的 16 字节 Session ID,随机数经历了什么? 一、为什么需要密码学安全随机数 1.1 一个真实的安全问题 Hical 框架 v1.0.0 的 Session ID 生成: 1 2 3 4 5 6 // v1.0.0(已修复) thread_local std::mt19937_64 rng(std::random_device{}()); std::uniform_int_distribution<uint64_t> dist; uint64_t hi = dist(rng); uint64_t lo = dist(rng); // 拼成 128 位十六进制 Session ID 看起来安全?不安全。 mt19937_64 是梅森旋转算法,一个确定性伪随机数生成器。攻击者只需收集 312 个连续的 64 位输出(约 156 个 Session ID),就能完全重建内部状态,预测此后所有 Session ID。 v2.0.0 的修复: 1 2 3 // v2.0.0 unsigned char buf[16]; RAND_bytes(buf, sizeof(buf)); // OpenSSL 密码学安全随机数 RAND_bytes 基于 AES-256 加密算法,即使攻击者收集到数十亿个输出,也无法预测下一个。 1.2 伪随机 vs 密码学安全随机 维度 伪随机(PRNG) 密码学安全(CSPRNG) 代表 mt19937、rand()、线性同余 RAND_bytes、getrandom(2) 内部状态 可从输出反推 不可从输出反推 前向安全 无(知道当前状态可反推历史) 有(每次输出后更新状态,旧状态不可恢复) 适用场景 模拟、游戏随机、统计抽样 密钥、Session ID、Token、Nonce 性能 ~3ns/64bit ~15ns/16bytes 标准 无 NIST SP 800-90A 判断标准:如果输出泄露后会造成安全影响(Session 劫持、密钥泄露),就必须用 CSPRNG。 ...

April 22, 2026 · 9 min · 1845 words

密码学工具 — 哈希函数 & 安全随机数

第 18 课:密码学工具 — 哈希函数 & 安全随机数 对应源文件: trantor/utils/Utilities.h — 公开 API(Hash128/160/256、所有哈希函数、secureRandomBytes) trantor/utils/Utilities.cc — 无 TLS 后端时的纯 C 实现 trantor/utils/crypto/openssl.cc — OpenSSL 后端实现 trantor/utils/crypto/botan.cc — Botan 后端实现 trantor/utils/crypto/md5.h/cc — 内置 MD5(纯 C) trantor/utils/crypto/sha1.h/cc — 内置 SHA1(纯 C,公有域) trantor/utils/crypto/sha256.h/cc — 内置 SHA256(纯 C) trantor/utils/crypto/sha3.h/cc — 内置 SHA3-256(Keccak,纯 C) trantor/utils/crypto/blake2.h/cc — 内置 BLAKE2b-256(纯 C) 一、整体架构:三层后端选择 trantor 的密码学工具采用编译期后端切换设计,同一套 API 在三种环境下对应不同实现: 1 2 3 4 5 6 7 8 9 10 11 12 13 用户代码 │ ▼ trantor::utils::md5(data, len) ← 统一 API(Utilities.h) │ ├─ USE_OPENSSL 定义时 ──→ crypto/openssl.cc (OpenSSL EVP API) ├─ USE_BOTAN 定义时 ──→ crypto/botan.cc (Botan HashFunction) └─ 两者均无时 ──────────→ Utilities.cc (内置纯 C 实现) ├─ crypto/md5.cc ├─ crypto/sha1.cc ├─ crypto/sha256.cc ├─ crypto/sha3.cc └─ crypto/blake2.cc 设计原理: ...

April 12, 2025 · 11 min · 2189 words