A-A+

密码存储备忘单 安全的随机数方法

2020年04月02日 19:48 汪洋大海 暂无评论 共1314字 (阅读1,623 views次)

安全随机数生成

各种安全关键功能都需要随机数(或字符串),例如生成加密密钥,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

布施恩德可便相知重

微信扫一扫打赏

支付宝扫一扫打赏

×

给我留言