密码存储备忘单 安全的随机数方法
安全随机数生成
各种安全关键功能都需要随机数(或字符串),例如生成加密密钥,IV,会话ID,CSRF令牌或密码重置令牌。因此,重要的是要安全地生成它们,并且攻击者不可能猜测和预测它们。
通常,计算机不可能生成真正的随机数(没有特殊硬件),因此大多数系统和语言都提供两种不同类型的随机性。
伪随机数生成器(PRNG)提供了低质量的随机性,速度更快,并且可用于与安全性无关的功能(例如页面上的排序结果或UI元素的随机化)。但是,不得将它们用于任何对安全性至关重要的事情,因为攻击者通常可能会猜测或预测输出。
加密安全的伪随机数生成器(CSPRNG)旨在产生更高质量的随机性(更严格地说,是更大的熵),从而使其可以安全地用于对安全敏感的功能。但是,它们速度较慢且占用大量CPU,在某些情况下,当需要大量随机数据时,它们可能最终阻塞。因此,如果需要大量与安全性无关的随机性,则可能不合适。
下表显示了每种语言的推荐算法以及不应该使用的不安全功能。
C | random() , rand() |
getrandom(2) |
Java | java.util.Random() |
java.security.SecureRandom |
PHP | rand() , mt_rand() , array_rand() , uniqid() |
random_bytes(), random_int() in PHP 7 or openssl_random_pseudo_bytes() in PHP 5 |
.NET/C# | Random() , |
RNGCryptoServiceProvider |
Objective-C | arc4random() (Uses RC4 Cipher), |
SecRandomCopyBytes |
Python | random() , |
secrets() |
Ruby | Random , |
SecureRandom |
Go | rand using math/rand package, |
crypto.rand package |
Rust | rand::prng::XorShiftRng , |
rand::prng::chacha::ChaChaRng and the rest of the Rust library CSPRNGs. |
UUID和GUID
通用唯一标识符(UUID或GUID)有时被用作生成随机字符串的快速方法。尽管它们可以提供合理的随机性来源,但这将取决于创建的UUID 的类型或版本。
具体来说,版本1 UUID由高精度时间戳和生成它们的系统的MAC地址组成,因此不是随机的(尽管鉴于时间戳接近100ns,它们可能很难猜测)。类型4 UUID是随机生成的,尽管是否使用CSPRNG完成将取决于实现。除非在特定的语言或框架中知道这是安全的,否则不应依赖UUID的随机性。
深度防御
即使加密控制失败,也应将应用程序设计为仍然安全。以加密形式存储的任何信息也应受到其他安全层的保护。应用程序也不应依赖于加密的URL参数的安全性,并且应强制执行严格的访问控制以防止未经授权的信息访问。
文章来源:https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html
布施恩德可便相知重
微信扫一扫打赏
支付宝扫一扫打赏