请选择 进入手机版 | 继续访问电脑版

专注代码检测 - 阅镜

 找回密码
 立即注册
热搜: 安装 代码
查看: 120|回复: 0

在需要高强度安全加密时不应使用弱PRNG函数

[复制链接]

70

主题

70

帖子

232

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
232
发表于 2021-9-10 20:07:19 | 显示全部楼层 |阅读模式
在需要生成 AES/SM1/HMAC 等算法的密钥/IV/Nonce, RSA/ECDSA/ECDH 等算法的私钥,这类需要高安全性的业务场景,必须使用密码学安全的随机数生成器 (Cryptographically Secure PseudoRandom Number Generator (CSPRNG) ), 不得使用  rand()  等无密码学安全性保证的普通随机数生成器。

推荐使用的 CSPRNG 有:

1、OpenSSL 中的 RAND_bytes()  函数,https://www.openssl.org/docs/man1.1.1/man3/RAND_bytes.html
2、libsodium 中的 randombytes_buf()  函数
3、Linux kernel 的 getrandom()  系统调用,https://man7.org/linux/man-pages/man2/getrandom.2.html . 或者读 /dev/urandom 文件, 或者 /dev/random 文件。
4、Apple IOS 的 SecRandomCopyBytes() ,https://developer.apple.com/docu ... -secrandomcopybytes
5、Windows 下的 BCryptGenRandom() , CryptGenRandom() , RtlGenRandom()

  1. #include <openssl/aes.h>
  2. #include <openssl/crypto.h>
  3. #include <openssl/rand.h>
  4. #include <unistd.h>

  5.     {
  6.         unsigned char key[16];
  7.         if (1 != RAND_bytes(&key[0], sizeof(key))) {  //... 错误处理
  8.             return -1;
  9.         }

  10.         AES_KEY aes_key;
  11.         if (0 != AES_set_encrypt_key(&key[0], sizeof(key) * 8, &aes_key)) {
  12.             // ... 错误处理
  13.             return -1;
  14.         }

  15.         ...

  16.         OPENSSL_cleanse(&key[0], sizeof(key));
  17.     }
复制代码

rand() 类函数的随机性并不高。敏感操作时,如设计加密算法时,不得使用rand()或者类似的简单线性同余伪随机数生成器来作为随机数发生器。符合该定义的比特序列的特点是,序列中“1”的数量约等于“0”的数量;同理,“01”、“00”、“10”、“11”的数量大致相同,以此类推。

例如 C 标准库中的  rand()  的实现只是简单的线性同余算法,生成的伪随机数具有较强的可预测性。

当需要实现高强度加密,例如涉及通信安全时,不应当使用  rand()  作为随机数发生器。

实际应用中, C++11 标准提供的  random_device保证加密的安全性和随机性 但是 C++ 标准并不保证这一点。跨平台的代码可以考虑用 OpenSSL 等保证密码学安全的库里的随机数发生器。

关联漏洞:
  1.   高风险-敏感数据泄露
复制代码
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

QQ|Archiver|手机版|小黑屋| 阅镜 ( 京ICP备2020034574号 )|网站地图|网站地图点击这里给我发消息

GMT+8, 2022-1-17 09:39 , Processed in 0.066332 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表