在JS中经常使用Math.Random|()函数来产生随机数,但这个函数产生的随机数并不具有真正的随机性,而且加密型不够强。因此在特定的需要加密性强的安全随机数时,可以使用JS提供的windows.crypto来生成随机数。
Window.crypto只读属性返回与全局对象关联的 Crypto对象。 这个对象允许网页访问某些加密相关服务。
为了确保足够的性能,不使用真正的随机数生成器,但是它们正在使用具有足够熵值伪随机数生成器。它所使用的 PRNG 的实现与其他不同,但适用于加密的用途。该实现还需要使用具有足够熵的种子。
使用crypto尽可能在https 环境下使用,否则有时会返回undefined 或者 空对象
函数比较
Math.random() : 返回介于 0(包含) ~ 1(不包含) 之间的一个随机数。该函数不是加密安全的随机数生成器。
window.crypto.getRandomValues(typedArray) : 返回非0的正整数,Crypto.getRandomValues(typedArray) 方法可以获取符合密码学安全性要求的随机值。
typedArray是一个基于整数的 TypedArray,其可以是 Int8Array、Uint8Array、Int16Array、 Uint16Array、 Int32Array 或 Uint32Array。生成的属技术会存储在typedArray 数组中。

使用方法
如果只需要生成安全随机数,可以按下面代码所示使用:

  var arr = new Uint16Array(8);
  window.crypto.getRandomValues(arr);
  for (var i = 0; i < arr.length; i++) {
    console.log(arr[i]);

这里需要注意:
window.crypto只能保证在通用浏览器上正常运行,如果要做兼容,需要使用如下前缀:

  • webkit 兼容Chrome,Safari,Opera的新版本,几乎所有的iOS浏览器(包括iOS版的Firefox);基本上,任何基于WebKit的浏览器
  • moz 兼容Firefox
  • o 兼容旧版,WebKit之前的版本以及Opera版
  • ms 兼容微软的Internet Explorer和Microsoft Edge

因此,要做全版本兼容,需要这样使用:

  var arr = new Uint16Array(8);
  var crypto = window.crypto || window.webkitCrypto 
  			|| window.mozCrypto || window.oCrypto || window.msCrypto;
  window.crypto.getRandomValues(arr);
  for (var i = 0; i < arr.length; i++) {
    console.log(arr[i]);

除了生成安全随机数,window.crypto还可以对数据进行加解密(crypto rsa 只有一个算法(RSA-OAEP)支持加密 / 解密),通常用法有:

  • 生成公私钥对:crypto.subtle.generateKey
  • 导出公私钥: window.crypto.subtle.exportKe
  • 导入公私钥:window.crypto.subtle.importKey
  • 加密:window.crypto.subtle.wrapKey
  • 解密:window.crypto.subtle.unwrapKey
  • 签名:crypto.subtle.sign
  • 验签:crypto.subtle.verify
  • 加密明文:crypto.subtle.encrypt
  • 解密密文:crypto.subtle.decrypt

由于并不常用,在这里不记录具体用法,有空再详细说明。

    在JS中经常使用Math.Random|()函数来产生随机数,但这个函数产生的随机数并不具有真正的随机性,而且加密型不够强。因此在特定的需要加密性强的安全随机数时,可以使用JS提供的windows.crypto来生成随机数。    Window.crypto只读属性返回与全局对象关联的 Crypto对象。 这个对象允许网页访问某些加密相关服务。    为了确保足够的性能,不使用真正的随机数生成器,但是它们正在使用具有足够熵值伪随机数生成器。它所使用的 PRNG 的实现与其他不同,但适用于加密的用
文章目录一、Math.random()获取随机数二、Window.crypto.getRandomValues()获取符合密码学要求的安全的随机值 一、Math.random() 获取随机数 获取xx以内的随机数:Math.random() * xx 举个例子,获取 n个字母 //创建26个字母数组 let arr = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X
Array.prototype.map.call(window.crypto.getRandomValues(new Uint8Array(16)), (item) => item.toString(16)).join(’’) Math.random().toString(36).slice(2) 真随机数 : 通过物理实验得出,比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等 伪随机数 : 通过一定算法和种子得出。软件实现的是伪随机数,其中难以预测的随机数称为强伪随机数,易于预测的随机数称为弱伪随机数 随机数特性 随机性 : 不存在统计学偏差,是完全杂乱的数列 不可预测性 : 不能从过去的数列推测出下一个出现的数 不可重现性 : 除非将数列本身保存下来,否则不能重现...
const pemEncodedKey = `-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxiuhgssxHclogWzB7OGy vkIB+HGUO4hODykrz3c0/SBLJZc78mq7VaL3EnicGpoXFJkao3I+1C7MD5Jpa27b Sc22veI0frbd/nbiSutvwAnf3rpVJEQtFTMz3v4OpSRcjOhIxKsL6iZ0JTt5++gk sqeyrMt...
报错:ModuleNotFoundError: No module named ‘Crypto’ 我已经安装了Crypto模块,在windows下面自动化为小写开头的crypto,导致找不到这个模块。 1.直接去windows目录改文件夹名称,把首字母改成大写,结果不行 2.下载安装 pip install cryptography==3.2.1,还是失败 3.pip uninstall crypto, pip install pycryptodome 你会发现site-packages下的该模块的目录名
Math.random() 函数返回一个浮点, 伪随机数在范围[0,1),也就是说,从0(包括0)往上,但是不包括1(排除1),然后您可以缩放到所需的范围。实现将初始种子选择到随机数生成算法;它不能被用户选择或重置。 1、0~1的随机数? Math.random(); 2、0~10的随机数? Math.random()*10; 3、0~10的随机整数? Math.floor(Math.ra...
### 回答1: Java中的随机数可以使用Math类中的random方法来生成。该方法返回一个到1之间的double类型的随机数,包括但不包括1。可以通过乘以一个范围值并加上一个起始值来生成指定范围内的随机数。例如,生成1到100之间的随机数可以使用以下代码: int randomNum = (int)(Math.random() * 100) + 1; 其中,Math.random()生成到1之间的随机数,乘以100后得到到100之间的随机数,再加1后得到1到100之间的随机数。最后将结果强制转换为int类型即可。 ### 回答2: Java中,我们可以使用Math.random()方法生成一个随机数。这个方法返回的是一个double类型的数字,它的范围是0.0到1.0之间。这个数字的随机性很高,因此可以使用它来生成各种类型的随机数。 比如,如果我们想要生成一个1到100之间的整数随机数,可以使用以下代码: int num = (int)(Math.random() * 100) + 1; 这里,我们先将Math.random()生成的小数乘以100,得到一个0到100之间的小数。然后再将它转化为一个整数,即可得到1到100之间的随机整数。 除了生成整数随机数,我们还可以使用Math.random()生成其他类型的随机数,比如生成一个随机的布尔值,生成一个随机的字符,生成一个随机的日期等等。只需要根据需要选择不同的方法和逻辑即可。 需要注意的是,Math.random()生成的随机数是伪随机数,它的随机性是通过算法来模拟实现的,也就是说存在一定的规律性。因此,在一些安全性要求高的场景下,建议使用其他更加随机的方式来生成随机数,比如SecureRandom类。 ### 回答3: Java中的 Math.random() 方法可以生成一个0到1之间的随机数,这个随机数是一个双精度(double)类型。我们可以通过一些变换来获得我们需要的随机数。 生成10以内的随机数 要生成10以内的随机数可以将生成的随机数乘以10,然后取整。代码如下: int r = (int) (Math.random() * 10); System.out.println(r); 生成 10 以内的随机数,我们可以利用 Math.random() * 10 生成一个 0 - 10 之间的随机数,接着再强制类型转换成 int 类型,就得到了一个 0 - 9 之间的随机整数。 生成区间内的随机数 如果需要生成一定范围内的随机数,需要进行一定的数学操作。比如需要生成3到12之间的随机数,可以用如下代码实现: int r = (int) (Math.random() * (12 - 3 + 1)) + 3; System.out.println(r); 这里的关键是理解数学公式:Math.random() * (12 - 3 + 1) 的结果是在 0 - 10 之间的随机数,再加上 3,结果就是在 3 - 12 之间的随机整数。 生成指定个数的随机数 如果需要生成指定个数的随机数,可以使用循环自动地生成多个随机数。比如生成6个1~30之间的随机数,可以使用如下代码: for(int i = 0; i < 6; i++) { int r = (int) (Math.random() * 30) + 1; System.out.println(r); 这段代码通过一个 for 循环,可以生成6个1~30之间的随机数,输出到控制台。 Math.random() 方法可以广泛应用于生成随机数的场合,可以通过数学操作等方式对随机数进行后处理得到我们需要的结果。