时间:2016-11-18来源:本站原创作者:佚名

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

C/C++

Java

.NET

Node.js

PHP

Python

Ruby

需要包含的一般条件

这篇文章的所有方案都必须只从内核的CSPRNG(CryptographicallySecurePseudo-RandomNumberGenerator,密码安全的伪随机数生成器)中读取,并且失败后立即关闭。用户空间的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系统(包括OSX):

/dev/urandom

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

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

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

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

#includesodium.h

intfoo(){

charmyString[32];

intmyInt;

randombytes_buf(myString,32);

/*myStringwillbeastringof32randombytes*/

myInt=randombytes_uniform(10);

/*myIntwillbearandomnumberbetween0and9*/

}

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

Java中的密码安全随机

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

SecureRandomcsprng=newSecureRandom();

byte[]randomBytes=newbyte[32];

csprng.nextBytes(randombytes);

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

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

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

RandomNumberGeneratorcsprng=newRNGCryptoServiceProvider();

byte[]rawByteArray=newbyte[32];

csprng.getBytes(rawByteArray);

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

Node.js中的密码安全随机

不要使用crypto.randomBytes()

在openssl抹掉crypto.randomBytes之前,你最好的选择是使用node-sodium(来替代这个函数)

varcsprng=require(sodium).Random;

varbytes=csprng.randombytes_buf(32);

PHP中的密码安全随机

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

$string=random_bytes(32);

$integer=random_int(0,PHP_INT_MAX);

如何你用的还是PHP5,获取random_







































北京治疗白癜风哪家医院安全
北京白癜风专治医院

转载请注明原文网址:http://www.gzdatangtv.com/jsyy/1548.html

------分隔线----------------------------