安全 wipe sensitive 数据从 内存
Cryptographic 关键和 plaintext 必须是 zeroed 从内存之后 use. Learn 为什么 memset 是不 enough 和如何prevent compiler 优化.
- 1
之后 using cryptographic 键或 plaintext, 它必须是 overwritten 具有 zeros 在内存. Simply letting 变量 go out 的作用域是 insufficient — 数据 remains 在内存直到 page 是 reused. challenge: compilers 优化离开 memset(键, 0, len) 如果键 是从不读取再次.
- 2 哈希计算器 →
Hash sensitive 数据之前过程如果你 need 到 retain non-reversible representation. hash 输出 replaces plaintext 在内存 — 原始是 wiped 之后哈希.
- 3 Base64 编码器 →
编码 sensitive data for transmission, then wipe the original plaintext from memory. The encoded form is not the secret — it is the transport representation. Wipe both after use.
- 4
在 C/C++, use explicit_bzero() 或 volatile pointer 到 prevent compiler 从 optimizing 离开 zeroing. 在 JavaScript, language 不保证内存 zeroing — use Uint8Array 和 overwrite 所有 bytes, 但是 aware GC 可以不 immediately reclaim 内存. 为 truly sensitive 操作, use Web Worker 和 terminate 它之后 use.
常见问题
- 为什么 compiler 优化离开 memset?
- 如果 compiler sees 该缓冲是 从不读取之后 memset(buf, 0, len), 它 considers zeroing "dead 存储" 和 removes 它为 性能. 函数 like explicit_bzero use volatile semantics 到 prevent 此优化.
- 是此 relevant 在 JavaScript?
- JavaScript strings 是 immutable 和 cannot 是 zeroed — avoid storing secrets 在 strings. Use Uint8Array (mutable) 和 overwrite 所有 bytes. However, GC 可以副本数据期间 compaction, leaving 副本在 内存. 为最大值安全, use Worker 和 terminate 它, 或 use WASM 具有手动内存管理.