如何在各种编程语言中生成安全的随机数

简介: 生成安全的随机数据指什么?为什么要生成安全的随机数据?之前一些文献中这并没有很好得说明如何生成“安全”的随机数。所以,这里将介绍如何在下面的编程语言中安全地生成随机数。 C/C++ Java .NET Node.js PHP Python Ruby 需要包含的一般条件 这篇文章的所有方案都必须只从内核的CSPRNG(Cryptographically Secure Pseudo-Random Number Generator,密码安全的伪随机数生成器)中读取,并且失败后立即关闭。

生成安全的随机数据指什么?为什么要生成安全的随机数据?之前一些文献中这并没有很好得说明如何生成“安全”的随机数。所以,这里将介绍如何在下面的编程语言中安全地生成随机数。

    C/C++

    Java

    .NET

    Node.js

    PHP

    Python

    Ruby

需要包含的一般条件

这篇文章的所有方案都必须只从内核的CSPRNG(Cryptographically Secure Pseudo-Random Number Generator,密码安全的伪随机数生成器)中读取,并且失败后立即关闭。用户空间的RNG以及回退到不安全的RNG都是不允许的。所以,根据平台的不同,使用下面的熵源:

  Windows:
        RtlGenRandom
Linux: getrandom (如何可用的话) 它的方法是正确的,在播种之前会阻塞,之后不再播种。
/dev/urandom (老的Linux内核) 对于在Linux启动时运行的软件,查询/dev/random,直到它可用。这意味着那时/dev/urandom已经播种了,你可以安全地从/dev/urandom中读取内容了,可以用到你的密码中。不要从/dev/random中读取。 OpenBSD: getentropy() arc4random_buf() 使用ChaCha20加密算法 (不是RC4) 其它类Unix系统 (包括OS X): /dev/urandom

这里不考虑依赖于haveged,egd等程序的解决方案。

C/C++中的密码安全随机

最简单和安全的方法是,把libsodium库添加到工程的依赖库中,使用randombytes_buf()函数。

这里查看libsodium是怎样实现这些函数的。PHP团队在其内部的random_bytes函数实现中采用了与此类似的方法。

#include "sodium.h"

int foo() {

    char myString[32];

    int myInt;

    

    randombytes_buf(myString, 32);

    /* myString will be a string of 32 random bytes */

    myInt = randombytes_uniform(10);

    /* myInt will be a random number between 0 and 9 */

}

如果可以的话就使用libsodium,下面的其它语言也是如此。

 

Java中的密码安全随机

除了使用libsodium(推荐),也可以直接使用Java的SecureRandom类:

SecureRandom csprng = new SecureRandom();

byte[] randomBytes = new byte[32];

csprng.nextBytes(randombytes);

注意:不要在Linux上使用SecureRandom.getInstanceStrong(),不要被名称误导,它等同于读取/dev/random,这个是不安全的。Java8中new SecureRandom()默认读取/dev/urandom,这才是你需要的。

 

.NET(C#)中的密码安全随机

普遍采用的方案是使用System.Security.Cryptography.RNGCryptoServiceProvider,比如:

RandomNumberGenerator csprng = new RNGCryptoServiceProvider();

byte[] rawByteArray = new byte[32];

csprng.getBytes(rawByteArray);

如果你需要生成密码上安全的整数,查看Inferno(一个Stan Drapkin写的.NET密码库)中的CryptoRandom类的实现方法。

 

Node.js中的密码安全随机

不要使用crypto.randomBytes()

var csprng = require("sodium").Random;

var bytes = csprng.randombytes_buf(32);

 

PHP中的密码安全随机

如果你运行的是PHP 7,有一个内置的函数:

$string = random_bytes(32);

$integer = random_int(0, PHP_INT_MAX);

如何你用的还是PHP 5, 获取random_compat,然后同PHP 7一样使用相同的API。

composer require paragonie/random_compat:^2

请使用版本2。版本1会回退到OpenSSL,如果没有其它可用的熵源,它会导致安全问题。然而,一些人为了兼容性,会明确地使用版本1。

如果你在写一个供别人在他们的工程中使用的PHP 5库,将你的composer.json条件字符串设置为^1|^2。相反,如果你在写一个应用程序,将条件字符串设置为^2。

 

Python中的密码安全随机

如果你没有使用libsodium: 如果你需要随机字节,使用os.urandom().

如果你需要其它格式的随机数据,你需要使用random.SystemRandom(),而不是random。

import sys

import random

# Random bytes

bytes = os.urandom(32)

csprng = random.SystemRandom()

# Random (probably large) integer

int = csprng.randint(0, sys.maxint)

 

Ruby中的密码安全随机

不要使用Ruby的SecureRandom!

与名称无关,它不是最好的CSPRNG。幸运的是,Tony Arcieri(密码专家,Cryptosphere 的设计者,全面的密码应用工程师)给Ruby community提供了一个安全的选择,将libsodium的sysrandom接口移植到了Ruby gem中。

建议:使用Sysrandom代理SecureRandom。

安装sysrandom:

gem install sysrandom

Sysrandom与SecureRandom API兼容。可以通过打补丁来代替SecureRandom。

相关文章
|
Linux iOS开发 MacOS
typora下载和破解(仅供学习)
Typora 一款 Markdown 编辑器和阅读器 风格极简 / 多种主题 / 支持 macOS,Windows 及 Linux 实时预览 / 图片与文字 / 代码块 / 数学公式 / 图表 目录大纲 / 文件管理 / 导入与导出 ……
167057 12
typora下载和破解(仅供学习)
|
Kubernetes 调度 容器
正确配置Kubelet可一定程度防止K8S集群雪崩
## Kubelet Node Allocatable - Kubelet Node Allocatable用来为Kube组件和System进程预留资源,从而保证当节点出现满负荷时也能保证Kube和System进程有足够的资源。 - 目前支持cpu, memory, ephemeral-storage三种资源预留。 - Node Capacity是Node的所有硬件资源,kube-r
11830 3
|
传感器 人工智能 安全
蔚来汽车智能座舱接入通义大模型,并使用通义灵码全面提效
为加速AI应用在企业市场落地,4月9日,阿里云在北京召开AI势能大会。阿里云智能集团资深副总裁、公共云事业部总裁刘伟光发表主题演讲,大模型的社会价值正在企业市场释放,阿里云将坚定投入,打造全栈领先的技术,持续开源开放,为AI应用提速。
|
机器学习/深度学习 人工智能 机器人
《探索人工智能的多元学派:符号主义、连接主义与行为主义》
人工智能发展过程中,符号主义、连接主义和行为主义学派各具特色。符号主义以逻辑推理为核心,通过符号表示知识并进行推理,适用于专家系统等领域;连接主义基于神经网络,强调数据处理与学习,擅长图像识别等任务;行为主义关注智能体与环境的交互,强调适应性和灵活性,广泛应用于机器人领域。三大学派各有优势与局限,未来的发展将更注重技术融合与创新。
2334 12
|
数据采集 JavaScript 前端开发
Puppeteer-py:Python 中的无头浏览器自动化
Puppeteer-py:Python 中的无头浏览器自动化
|
存储 人工智能 物联网
人人都是设计师,挑战0代码打造专属氛围感风格海报!
无需编程和设计基础,借助阿里云PAI ArtLab,轻松实现任意风格的海报设计。通过在线服务PAI-EAS和对象存储OSS,用户可以快速部署ComfyUI环境,上传线稿后一键生成企业风格海报。提供详细的操作步骤和多种风格示例,如岩石废土风、节日圣诞风和假日海洋风,帮助你轻松上手,快速出图。
656 15
|
存储 监控 NoSQL
揭秘Redis慢查询:这个工具将彻底改变你的性能优化策略!
【8月更文挑战第8天】在互联网应用中,数据库性能常成瓶颈。Redis作为高速内存数据库亦可能遭遇慢查询问题。本文探讨慢查询成因与解决方法。首先定义慢查询及其影响因素,随后介绍Redis内置的慢查询日志功能,通过配置`slowlog-log-slower-than`与`slowlog-max-len`来监控执行时间过长的命令。利用`SLOWLOG get`命令分析日志,定位性能瓶颈所在。以`LRANGE`命令为例,提出数据结构调整、使用流水线、限制返回元素数量、异步执行及优化内存使用等策略。最终实现Redis性能提升,确保应用流畅运行。性能优化需持续监控、分析与调整。
581 1
|
缓存 Linux 网络安全
解决 CentOS 7 官方 yum 仓库无法使用的最佳实践
【8月更文挑战第18天】若 CentOS 7 的官方 YUM 仓库无法使用,可按以下步骤解决: 1. **检查网络连接**: - 确认服务器能正常上网,可通过访问外部网站或网络诊断测试。 - 检查防火墙设置,避免其阻挡 YUM 的网络访问。 2. **检查 YUM 配置**: - 核实 `/etc/yum.repos.d/` 下的 `CentOS-Base.repo` 文件中仓库地址正确无误。 - 确认配置文件内的 `enabled` 选项设为 `1` 以启用仓库。
6588 0
|
存储 运维 安全
企业数据存储与备份解决方案
基于阿里云提供的存储与灾备平台,提供数据备份、数据容灾保护以及策略化归档管理,满足客户的数据合规性要求和多种数据源的快速备份恢复需求,保障业务连续性,节省企业运维成本,消除企业后顾之忧。
379 2
|
JavaScript 开发者 UED
静态网站生成:使用VuePress建立静态文档网站
【4月更文挑战第24天】VuePress是一款基于Vue.js的静态网站生成器,适用于构建文档类网站,以其Markdown渲染和Vue组件支持深受喜爱。要使用VuePress搭建静态文档网站,首先确保安装Node.js和npm,然后全局安装VuePress。创建项目,编辑Markdown文件,自定义样式和配置,通过`vuepress dev`启动本地服务器预览,最后用`vuepress build`生成静态文件进行部署。VuePress简化了内容创建和网站定制,是开发文档网站的理想选择。
564 4