首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么/dev/urandom不阻塞?

/dev/urandom 是 Linux 和类 Unix 系统(如 macOS)中的一个设备文件,用于生成随机数。与 /dev/random 不同,/dev/urandom 不会阻塞,原因如下:

  1. 随机数生成算法:/dev/urandom 使用的是伪随机数生成器(PRNG,Pseudo-Random Number Generator),而不是真正的随机数生成器。伪随机数生成器使用数学算法和初始种子值来生成随机数序列。虽然这些数字看起来是随机的,但它们实际上是由确定性过程生成的。
  2. 随机性来源:/dev/random 依赖于系统中的熵池(entropy pool)来生成真正的随机数。熵池中的数据来自系统中的各种随机事件,如键盘敲击、鼠标移动等。当熵池中的数据不足时,/dev/random 会阻塞,直到收集到足够的熵。而 /dev/urandom 不依赖于熵池,因此不会因为熵池数据不足而阻塞。
  3. 性能考虑:由于 /dev/urandom 使用伪随机数生成器,它在生成随机数时不需要等待熵池中的数据,因此性能更好。这使得 /dev/ur’t 成为许多应用程序的首选,尤其是在对性能要求较高的场景中。

总之,/dev/urandom 不会阻塞,因为它使用伪随机数生成器,不依赖于系统熵池,且性能更好。然而,需要注意的是,虽然 /dev/urandom 生成的数字看起来是随机的,但在某些安全性要求极高的场景中,可能不如 /dev/random 生成的真正随机数安全。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 为什么这段代码会阻塞

    01、故事开始的地方——这段代码为什么阻塞?...你看出来这段代码为什么阻塞了吗?...当通过一个无缓冲通道发送数据时,接收者收到数据发生在再次唤醒发送者 goroutine 之前 (happens before) 由此,我们可以证明,「streamTextPreProcessStop 应该可以阻塞的往里放一个数据的...类似的,向通道写入数据时,如果缓冲区已满,也会阻塞,直到有协程从缓冲区中读出数据。 对于值为 nil 的通道,无论读写都会阻塞,而且是永久阻塞。...这是一个没有缓冲区的通道,有几个协程阻塞等待读数据: 处于等待队列中的协程,会在其他协程操作通道时被唤醒: 因读阻塞的协程会被向通道写数据的协程唤醒。 因写阻塞的协程会被从通道读数据的协程唤醒。

    27321

    重启Tomcat时,报错deployDirectory Deploying web application directory解决办法

    接下来解释一下 /dev/urandom  和  /dev/random  这两种不同的文件的区别, /dev/random 在不能产生新的随机数的情况下会阻塞程序,程序挂起便没法继续执行,直到熵池产生新的随机字节后才能返回...,程序再接着执行,这就是  /dev/random 比 /dev/urandom 产生大量随机数的速度要慢的原因,也是为什么使用这个文件生成随机数时,tomcat启动的速度被拖慢的原因。...而 /dev/urandom 这种方式在不能产生新的随机数时不会阻塞程序,当然了,这样的话生成随机数的效果没有  /dev/random 这种方式好,这对于加解密这样的应用来说并不是一个很好的选择。    ...但是 /dev/random 是一个阻塞数字生成器,如果它没有足够的随机数据提供,它就一直等,这迫使 JVM 等待(程序挂起/tomcat启动拖慢)。.../urandom 这里值为何要在 dev 和 random 之间加一个点呢?

    1.3K20

    Tomcat启动一直卡在webappsROOT的解决方案

    /urandom 说一下这个random和urandom的区别: tomcat启动的时候会实例化SecureRandom对象,实例化对象使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom...Linux 中的随机数可以从两个特殊的文件中产生,一个是 /dev/urandom,另外一个是 /dev/random。...这就是为什么会有 /dev/urandom 和 /dev/random 这两种不同的文件,后者在不能产生新的随机数时会阻塞程序,而前者不会(ublock),当然产生的随机数效果就不太好了,这对加密解密这样的应用来说就不是一种很好的选择.../dev/random 会阻塞当前的程序,直到根据熵池产生新的随机字节之后才返回,所以使用 /dev/random 比使用 /dev/urandom 产生大量随机数的速度要慢。...但是 /dev/random 是一个阻塞数字生成器,如果它没有足够的随机数据提供,它就一直等,这迫使 JVM 等待。键盘和鼠标输入以及磁盘活动可以产生所需的随机性或熵。

    82810

    Linux系统下Tomcat8启动速度很慢的解决方法

    1)如果java.security.egd属性或securerandom.source属性指定的是”file:/dev/random”或”file:/dev/urandom”,那么JVM会使用本地种子产生器...这就是为什么我们设置值为”file:///dev/urandom”或者值为”file:/./dev/random”都会起作用的原因。...当熵池为空时,来自/dev/random的读操作将被阻塞,直到熵池收集到足够的环境噪声数据。这么做的目的是成为一个密码安全的伪随机数发生器,熵池要有尽可能大的输出。...这就意味着,Tomcat在生产环境中使用熵池时,会被阻塞较长的时间。 解决 有两种解决办法: 1)在Tomcat环境中解决 可以通过配置JRE使用非阻塞的Entropy Source。...在catalina.sh中加入这么一行: -Djava.security.egd=file:/dev/./urandom 即可。

    2K42

    Tomcat启动一直卡在webappsROOT的解决方案

    /urandom 说一下这个random和urandom的区别: tomcat启动的时候会实例化SecureRandom对象,实例化对象使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom...Linux 中的随机数可以从两个特殊的文件中产生,一个是 /dev/urandom,另外一个是 /dev/random。...这就是为什么会有 /dev/urandom 和 /dev/random 这两种不同的文件,后者在不能产生新的随机数时会阻塞程序,而前者不会(ublock),当然产生的随机数效果就不太好了,这对加密解密这样的应用来说就不是一种很好的选择.../dev/random 会阻塞当前的程序,直到根据熵池产生新的随机字节之后才返回,所以使用 /dev/random 比使用 /dev/urandom 产生大量随机数的速度要慢。...但是 /dev/random 是一个阻塞数字生成器,如果它没有足够的随机数据提供,它就一直等,这迫使 JVM 等待。键盘和鼠标输入以及磁盘活动可以产生所需的随机性或熵。

    74820

    又出生产事故!那些年我曾犯过的错-SecureRandom

    /dev/random的一个副本是/dev/urandom(“unblocked”,非阻塞的随机数发生器[4]),它会重复使用熵池中的数据以产生伪随机数据。...这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。 它可以作为生成较低强度密码的伪随机数生成器,建议用于生成高强度长期密码。.../urandom参数没起作用,仍使用/dev/random作为随机数的熵池,时间久或调用频繁的话熵池很容易不够用而导致阻塞;于是看了一下 SecureRandom.getInstanceStrong().../urandom作为熵池,不会遇到阻塞问题。.../urandom (这个文件名多个u)强制使用/dev/urandom这个文件,避免阻塞现象。中间加个点的解释是因为某个JDK BUG,SO那个帖子有链接。

    4.3K20

    devurandom和devrandom的区别

    linux中提供了 /dev/urandom 和 /dev/random 两个特殊设备来提供随机数。那么这两个文件有什么区别呢? 要回答这个问题,先需要了解熵这个概念。...与 /dev/urandom 的区别 /dev/random 是真随机数生成器,它会消耗熵值来产生随机数,同时在熵耗尽的情况下会阻塞,直到有新的熵生成..../dev/urandom 是伪随机数生成器,它根据一个初始的随机种子(这个种子来源就是熵池中的熵)来产生一系列的伪随机数,而并不会在熵耗尽的情况下阻塞。...但是 若在系统启动阶段使用 =/dev/urandom= 则可能存在熵池中还不存在任何熵的情况,这时用 =/dev/urandom= 产生的随机数是可预测的!...结合两者的特点,可以看出,除非要在启动启动阶段产生随机数,否则绝大多数情况下还是使用 /dev/urandom 来产生随机数,这样才不会引起程序莫名的挂起。

    2.3K30

    Linux 中的 devrandom 和 devurandom 是什么?

    /dev/urandom 与/dev/random不同,/dev/urandom是一个伪随机数生成器设备文件,它通过使用内部熵池来生成随机数。它会持续生成随机数,无论系统上的环境噪声有多少。...因此,/dev/urandom生成的随机数速度比/dev/random快得多。 由于/dev/urandom使用的是伪随机数生成算法,因此在某些情况下,可能会产生较低质量的随机数。...如何使用 /dev/random 和 /dev/urandom 在Linux系统中,可以通过读取/dev/random或/dev/urandom来获取随机数。...dev/urandom 请注意,这些命令将生成二进制随机数据。.../dev/random 会在熵池中的熵低于一定值时阻塞等待熵的增加,而 /dev/urandom 不会阻塞等待熵,而是使用伪随机数生成器来生成随机数。

    3.6K00

    L016使用devrandom生成随机数

    如果在熵池中没有可用的随机性位, /dev/random 在池中有足够的随机性之前等待,返回结果。这意味着如果使用 /dev/random 来产生许多随机数,就会发现它太慢了,不够实用。...我们经常看到 /dev/random 生成几十字节的数据,然后在许多秒内都不产生结果。 幸运的是有熵池的另一个接口可以绕过这个限制:/dev/urandom。...然而,仍然认为 /dev/urandom 比 /dev/random 要“不安全一些”(并通常值得怀疑)。...应用中出现的问题: 在我们的服务器程序中,用户登陆的时候会读取/dev/random产生随机数,问题来了,当用户登陆比较密集,这时候read就会返回特别慢,并且返回的字节数也比要求的少,甚至返回――阻塞...17 – 19行: 无阻塞模式打开/dev/random设备。如果该设备打开失败尝试打开/dev/urandom

    1.2K40

    研发:springboot 应用基于k8s 部署pod启动缓慢排查

    Linux系统上的设备/dev/random和/dev/urandom是不同的。 /dev/random设备提供的不是伪随机数据,而是基于环境中的真实随机因素(即背景噪声作为熵源)的随机数据。...所以,/dev/random不像设备/dev/urandom。后者是一个伪随机数据生成器,能按照请求快速生成所需数量的数据。/dev/random能生成多少内容由环境中的噪声决定。...数据不足时,/dev/random只能等待。 所以,在内容不足时,/dev/random会将读操作阻塞,直至收集到足够的随机数据。...这就是测试结果差异产生的原因,/dev/random阻塞第二次的读操作将近1分钟时间。 所以,对于使用了/dev/random设备的而言,都有被阻塞的可能。...解决方案简单说,就是除非有明确的理由,必须要使用/dev/random设备。否则,使用/dev/urandom设备即可。

    4K10

    使用 SecureRandom 产生随机数采坑记录

    random 设备了提供了 2 个字符设备供用户态进程使用——/dev/random 和/dev/urandom: /dev/random 适用于对随机数质量要求比较高的请求,在熵池中数据不足时, 读取...这样的设计使得/dev/random 是真正的随机数发生器,提供了最大可能的随机数据熵。 /dev/urandom,非阻塞的随机数发生器,它会重复使用熵池中的数据以产生伪随机数据。...这表示对/dev/urandom 的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random 的。它可以作为生成较低强度密码的伪随机数生成器,对大多数应用来说,随机性是可以接受的。...解决方案 有了以上的的解释,我们就知道解决方案了,使用 /dev/urandom 这种非阻塞的方式来产生随机数即可解决问题,在 Java 中我们改成如下写法即可解决问题 SecureRandom random...= new SecureRandom(); new SecureRandom() 使用 /dev/urandom 生成种子,不会产生阻塞

    3.5K20
    领券