searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

libvirt虚拟随机数生成器

2023-03-30 01:25:11
38
0

虚拟随机数生成器设备允许主机将熵传递给guest操作系统。Since 1.0.3

一、随机数简介

1. 随机数的重要性

随机数在计算中很重要。 TCP/IP 序列号、密码源和 DNS 源端口号都依赖于随机数。

在密码学中,随机性无处不在,从密钥的生成到加密系统,甚至密码系统受到攻击的方式。没有随机性,所有加密操作都是可预测的,因此不安全。

2. 随机数产生的原理

为了尽可能的做到随机,随机数生成器会收集系统环境中各种数据,比如:鼠标的移动,键盘的输入, 终端的连接以及断开,音视频的播放,系统中断,内存 CPU 的使用等等

生成器把收集到的各种环境数据放入一个池子 ( 熵池 ) 中,然后将这些数据进行去偏、漂白,主要目的也是使得数据更加无序,更加难以猜测或者预料得到

有了大量的环境数据之后,每次获取随机数时,从池子中读取指定的字节序列,这些字节序列就是生成器生成的随机数

3. 随机数生成器的结构

下图是随机数生成器的结构:

整个生成器的结构分成 收集器、主熵池、次熵池、urandom熵池、计数器几部分:

  • 收集器

收集器收集系统中的环境噪音,比如:鼠标、键盘、中断事件、内存、CPU等,收集之后进行批量去偏、漂白之后进入主熵池中

  • 主熵池

主熵池接收收集器传递过来的环境数据,大小为 512字节( 4098二进制位) , 它为次熵池和 urandom 熵池提供随机数

在 Linux上,可以通过下面的命令查看当前系统主熵池大小, 单位是 二进制位的数量

cat /proc/sys/kernel/random/poolsize

  • 次熵池

/dev/random 设备关连的,大小为128字节,它是阻塞的

  • urandom 熵池

和 /dev/urandom 设备关连的,大小为128字节,它是非阻塞的

  • 计数器

主熵池 、次熵池 以及 urandom熵池各自都有一个计数器,用一个整数值来记录,表示当前熵池中可用随机数的数量,这是一个预估的值,它是生成器根据熵池中的环境数据估算出来的

当熵池中有新的随机数加入时,对应熵池的计数器计数会增加,当熵池中随机数被取出时,熵池计数器计数减少

  • 输出接口

生成器主要有 /dev/random、/dev/urandom、get_random_bytes() 这三个接口

  • /dev/random、/dev/urandom

可以从用户空间去访问这两设备文件,即使是普通用户也有访问权限,它们返回指定请求数量的随机数

  • get_random_bytes()

只供内核使用的接口, 返回指定请求数量的随机数。

二、libvirt虚拟随机数生成器

1. 用法示例

Example: usage of the RNG device:

...

<devices>

  <rng model='virtio'>

    <rate period="2000" bytes="1234"/>

    <backend model='random'>/dev/random</backend>

    <!-- OR -->

    <backend model='egd' type='udp'>

      <source mode='bind' service='1234'/>

      <source mode='connect' host='1.2.3.4' service='1234'/>

    </backend>

    <!-- OR -->

    <backend model='builtin'/>

  </rng>

</devices>

2. 各元素取值

model(required):取值取决于虚拟化平台。

  • virtio - supported by qemu and virtio-rng kernel module
  • virtio-transitional Since 5.2.0
  • virtio-non-transitional Since 5.2.0

rate(optional):可选的速率元素可以设置从源消耗熵的速率。

  • bytes(required):指定每个周期允许消耗多少字节。
  • period(optional):周期属性,以毫秒为单位指定一个周期的持续时间;如果省略,则周期取1000毫秒(1秒)。Since 1.0.4

backend(required):用于指定熵源。使用model属性配置源模型。支持的源模型包括:

  • random:此后端类型需要一个非阻塞字符设备作为输入。后端元素的内容填写设备路径,从3.4开始,接受任何路径。在此之前,/dev/random和/dev/hwrng是唯一可接受的路径。如果未指定设备路径,则使用hypervisor的默认值。对于QEMU,默认值为/dev/random。然而,推荐的熵源是/dev/urandom(因为它没有/dev/random的限制)。
  • egd:此后端使用EGD协议连接到源。源被指定为字符设备。 
  • builtin:这个后端使用qemu内置的随机生成器,它使用getrandom()系统调用作为熵的来源。(自6.1.0和QEMU 4.2开始)

3. libvirt随机数生成器使用示例

3.1在libvirt xml中加入rng设备

3.2分别启动加入有rng设备的虚机和没有rng设备的虚机

3.2.1加入rng设备前

虚机系统没有hwrng进程

random初始化需要140s。

熵池值始终很低:cat /proc/sys/kernel/random/entropy_avail

3.2.2加入rng设备后

虚机系统有hwrng进程

系统传入rng设备后,random初始化仅需1.6s。

熵池值比较高:cat /proc/sys/kernel/random/entropy_avail

产生随机数的方法:

dd if=/dev/hwrng of=data.bin bs=200 count=1

如下图所示,输入了如下随机数到文件data.bin:

 

0条评论
0 / 1000
林****龙
4文章数
0粉丝数
林****龙
4 文章 | 0 粉丝
原创

libvirt虚拟随机数生成器

2023-03-30 01:25:11
38
0

虚拟随机数生成器设备允许主机将熵传递给guest操作系统。Since 1.0.3

一、随机数简介

1. 随机数的重要性

随机数在计算中很重要。 TCP/IP 序列号、密码源和 DNS 源端口号都依赖于随机数。

在密码学中,随机性无处不在,从密钥的生成到加密系统,甚至密码系统受到攻击的方式。没有随机性,所有加密操作都是可预测的,因此不安全。

2. 随机数产生的原理

为了尽可能的做到随机,随机数生成器会收集系统环境中各种数据,比如:鼠标的移动,键盘的输入, 终端的连接以及断开,音视频的播放,系统中断,内存 CPU 的使用等等

生成器把收集到的各种环境数据放入一个池子 ( 熵池 ) 中,然后将这些数据进行去偏、漂白,主要目的也是使得数据更加无序,更加难以猜测或者预料得到

有了大量的环境数据之后,每次获取随机数时,从池子中读取指定的字节序列,这些字节序列就是生成器生成的随机数

3. 随机数生成器的结构

下图是随机数生成器的结构:

整个生成器的结构分成 收集器、主熵池、次熵池、urandom熵池、计数器几部分:

  • 收集器

收集器收集系统中的环境噪音,比如:鼠标、键盘、中断事件、内存、CPU等,收集之后进行批量去偏、漂白之后进入主熵池中

  • 主熵池

主熵池接收收集器传递过来的环境数据,大小为 512字节( 4098二进制位) , 它为次熵池和 urandom 熵池提供随机数

在 Linux上,可以通过下面的命令查看当前系统主熵池大小, 单位是 二进制位的数量

cat /proc/sys/kernel/random/poolsize

  • 次熵池

/dev/random 设备关连的,大小为128字节,它是阻塞的

  • urandom 熵池

和 /dev/urandom 设备关连的,大小为128字节,它是非阻塞的

  • 计数器

主熵池 、次熵池 以及 urandom熵池各自都有一个计数器,用一个整数值来记录,表示当前熵池中可用随机数的数量,这是一个预估的值,它是生成器根据熵池中的环境数据估算出来的

当熵池中有新的随机数加入时,对应熵池的计数器计数会增加,当熵池中随机数被取出时,熵池计数器计数减少

  • 输出接口

生成器主要有 /dev/random、/dev/urandom、get_random_bytes() 这三个接口

  • /dev/random、/dev/urandom

可以从用户空间去访问这两设备文件,即使是普通用户也有访问权限,它们返回指定请求数量的随机数

  • get_random_bytes()

只供内核使用的接口, 返回指定请求数量的随机数。

二、libvirt虚拟随机数生成器

1. 用法示例

Example: usage of the RNG device:

...

<devices>

  <rng model='virtio'>

    <rate period="2000" bytes="1234"/>

    <backend model='random'>/dev/random</backend>

    <!-- OR -->

    <backend model='egd' type='udp'>

      <source mode='bind' service='1234'/>

      <source mode='connect' host='1.2.3.4' service='1234'/>

    </backend>

    <!-- OR -->

    <backend model='builtin'/>

  </rng>

</devices>

2. 各元素取值

model(required):取值取决于虚拟化平台。

  • virtio - supported by qemu and virtio-rng kernel module
  • virtio-transitional Since 5.2.0
  • virtio-non-transitional Since 5.2.0

rate(optional):可选的速率元素可以设置从源消耗熵的速率。

  • bytes(required):指定每个周期允许消耗多少字节。
  • period(optional):周期属性,以毫秒为单位指定一个周期的持续时间;如果省略,则周期取1000毫秒(1秒)。Since 1.0.4

backend(required):用于指定熵源。使用model属性配置源模型。支持的源模型包括:

  • random:此后端类型需要一个非阻塞字符设备作为输入。后端元素的内容填写设备路径,从3.4开始,接受任何路径。在此之前,/dev/random和/dev/hwrng是唯一可接受的路径。如果未指定设备路径,则使用hypervisor的默认值。对于QEMU,默认值为/dev/random。然而,推荐的熵源是/dev/urandom(因为它没有/dev/random的限制)。
  • egd:此后端使用EGD协议连接到源。源被指定为字符设备。 
  • builtin:这个后端使用qemu内置的随机生成器,它使用getrandom()系统调用作为熵的来源。(自6.1.0和QEMU 4.2开始)

3. libvirt随机数生成器使用示例

3.1在libvirt xml中加入rng设备

3.2分别启动加入有rng设备的虚机和没有rng设备的虚机

3.2.1加入rng设备前

虚机系统没有hwrng进程

random初始化需要140s。

熵池值始终很低:cat /proc/sys/kernel/random/entropy_avail

3.2.2加入rng设备后

虚机系统有hwrng进程

系统传入rng设备后,random初始化仅需1.6s。

熵池值比较高:cat /proc/sys/kernel/random/entropy_avail

产生随机数的方法:

dd if=/dev/hwrng of=data.bin bs=200 count=1

如下图所示,输入了如下随机数到文件data.bin:

 

文章来自个人专栏
软硬结合测试
4 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
1
0