在项目过程中,尤其安全(加解密)是必须项的工程中,往往会涉及到随机数(Random)的产生,进而需要关注 TRNG 和 PRNG 的使用。
TRNG 真随机数生成器依赖于硬件对物理世界数据的采集,产生效率低,成本高(需要具备相关硬件模块)。
PRNG 伪随机数生成器主要依赖于算法产生随机数,产生效率高,成本低。
下面是我遇到需要使用 TRNG 产生随机数的场景下,对测试设备进行测试的结果的整理和部分传感器罗列,更详细的说明,可以参考官网说明。
通过传感器数据采集来确认可用作产生熵的传感器。测试设备有: 一加,Google Pixel 6。
移动传感器
测试 移动传感器 类型,将手机静置在桌面,运行采集程序。
传感器的可能架构因传感器类型而异:
- 重力 线性加速度 旋转矢量 有效运动 计步器 和 步测器传感器 可能基于硬件,也可能基于软件。
- 加速度计传感器 和 陀螺仪传感器 始终基于硬件。
传感器类型:
类型 | 说明 | 事件数据 |
---|---|---|
Sensor.TYPE_GYROSCOPE | 陀螺仪传感器 | 单位:弧度/秒SensorEvent.values[0] 绕 x 轴的旋转速率。SensorEvent.values[1] 绕 y 轴的旋转速率。SensorEvent.values[2] 绕 z 轴的旋转速率。 |
Sensor.TYPE_GYROSCOPE_UNCALIBRATED | 未校准的陀螺仪传感器 | 单位:弧度/秒SensorEvent.values[0] 绕 x 轴的旋转速率(无漂移补偿)。SensorEvent.values[1] 绕 y 轴的旋转速率(无漂移补偿)。SensorEvent.values[2] 绕 z 轴的旋转速率(无漂移补偿)。SensorEvent.values[3] 绕 x 轴的估算漂移。SensorEvent.values[4] 绕 y 轴的估算漂移。SensorEvent.values[5] 绕 z 轴的估算漂移。 |
Sensor.TYPE_GRAVITY | 重力传感器 | 单位:米/秒2SensorEvent.values[0] 沿 x 轴的重力。SensorEvent.values[1] 沿 y 轴的重力。SensorEvent.values[2] 沿 z 轴的重力。 |
Sensor.TYPE_LINEAR_ACCELERATION | 线性加速度传感器 | 单位:米/秒2SensorEvent.values[0] 沿 x 轴的加速力(不包括重力)。SensorEvent.values[1] 沿 y 轴的加速力(不包括重力)。SensorEvent.values[2] 沿 z 轴的加速力(不包括重力)。 |
Sensor.TYPE_ROTATION_VECTOR | 旋转矢量传感器 | 无单位SensorEvent.values[0] 沿 x 轴的旋转矢量分量 (x * sin(θ/2))。SensorEvent.values[1] 沿 y 轴的旋转矢量分量 (y * sin(θ/2))。SensorEvent.values[2] 沿 z 轴的旋转矢量分量 (z * sin(θ/2))。SensorEvent.values[3] 旋转矢量的标量分量 ((cos(θ/2))。 |
Sensor.TYPE_SIGNIFICANT_MOTION | 有效运动传感器 | 不提供相关值。 |
Sensor.TYPE_STEP_COUNTER | 计步器传感器 | 单位:步数SensorEvent.values[0] 传感器最后一次重新启动以来用户迈出的步数。 |
Sensor.TYPE_STEP_DETECTOR | 步测器传感器 | 不提供相关值。 |
Sensor.TYPE_ACCELEROMETER | 加速度计 | 单位:米/秒2SensorEvent.values[0] 沿 x 轴的加速力(包括重力)。SensorEvent.values[1] 沿 y 轴的加速力(包括重力)。SensorEvent.values[2] 沿 z 轴的加速力(包括重力)。 |
Sensor.TYPE_ACCELEROMETER_UNCALIBRATED | 未校准的加速度计传感器 | 单位:米/秒2SensorEvent.values[0] 沿 X 轴测量的加速度,没有任何偏差补偿。SensorEvent.values[1] 沿 Y 轴测量的加速度,没有任何偏差补偿。SensorEvent.values[2] 沿 Z 轴测量的加速度,没有任何偏差补偿。SensorEvent.values[3] 沿 X 轴测量的加速度,并带有估算的偏差补偿。SensorEvent.values[4] 沿 Y 轴测量的加速度,并带有估算的偏差补偿。SensorEvent.values[5] 沿 Z 轴测量的加速度,并带有估算的偏差补偿。 |
其中对应的类型值,在官方移动传感器说明页。
需要留意的几点:
- 重力传感器, 线性加速度传感器 和 旋转矢量传感器 都依赖于 陀螺仪传感器。 如果设备没有陀螺仪,这些传感器将不会显示并且无法使用。
- 当设备处于静止状态时,重力传感器 的输出 应该与 加速度计 的相同。
- 如果应用以 Android 12(API 级别 31)或更高版本为目标平台,若将受到速率限制。
- 使用 计步器传感器 和 步测器传感器 时,需要申请权限 ACTIVITY_RECOGNITION。
一加 Ace3:
- 加速度传感器普及率高且始终基于硬件,它捕捉数据比较敏锐,产生熵快速。—— Sensor.TYPE_ACCELEROMETER,Sensor.TYPE_ACCELEROMETER_UNCALIBRATED,5s 捕捉数据 2005 条记录。
- 陀螺仪传感器的普及率不及加速度传感器,一些低端机不配备它。且如果设备没有陀螺仪,相应的依赖于它的 重力传感器, 线性加速度传感器 和 旋转矢量传感器 也不能使用。如果设备有陀螺仪,它是产生熵值的良好的传感器,且对应的会多出其他 3 个依赖于它的传感器数据。
- 陀螺仪 5s 捕捉数据 2035 条记录。
- 重力传感器 5s 捕捉数据 1013 条记录。
- 线性加速度传感器 5s 捕捉数据 1013 条记录。
- 旋转矢量传感器 5s 捕捉数据 1014 条记录。
- 有效运动传感器,和 步测器传感器这两个传感器并不直接参与数据的捕捉。 计步器传感器捕捉数据并不敏感,不适合用作产生熵。
Pixel 6:
- 加速度传感器 5s 捕捉数据 2119 条记录。
- 陀螺仪 5s 捕捉数据 2125 条记录。
- 重力传感器 5s 捕捉数据 1051 条记录。
- 线性加速度传感器 5s 捕捉数据 351 条记录。
- 旋转矢量传感器 5s 捕捉数据 1053 条记录。
- 有效运动传感器,步测器传感器和 计步器传感器无有效数据。
位置传感器
Android 平台提供两种传感器,帮助确定设备的位置:地磁场传感器和加速度计。还提供一种传感器,可帮助您确定设备表面与物体的邻近程度(名为近程传感器)。
地磁场传感器和近程传感器均基于硬件。
位置传感器通常不用于监控设备的移动情况。
地磁场传感器提供单个传感器事件中所有三个坐标轴的地磁场强度值。
下面列出了主要的位置传感器的种类。
类型 | 说明 | 事件数据 |
---|---|---|
Sensor.TYPE_GAME_ROTATION_VECTOR | 游戏旋转矢量传感器 | 无单位SensorEvent.values[0] 沿 x 轴的旋转矢量分量 (x * sin(θ/2))。SensorEvent.values[1] 沿 y 轴的旋转矢量分量 (y * sin(θ/2))。SensorEvent.values[2] 沿 z 轴的旋转矢量分量 (z * sin(θ/2))。 |
Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR | 地磁旋转矢量传感器 | 无单位SensorEvent.values[0] 沿 x 轴的旋转矢量分量 (x * sin(θ/2))。SensorEvent.values[1] 沿 y 轴的旋转矢量分量 (y * sin(θ/2))。SensorEvent.values[2] 沿 z 轴的旋转矢量分量 (z * sin(θ/2))。 |
Sensor.TYPE_MAGNETIC_FIELD | 地磁场传感器 | 单位:μTSensorEvent.values[0] 沿 x 轴的地磁场强度。SensorEvent.values[1] 沿 y 轴的地磁场强度。SensorEvent.values[2] 沿 z 轴的地磁场强度。 |
Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED | 未经校准的磁力计 | 单位:μTSensorEvent.values[0] 沿 x 轴的地磁场强度(无硬铁校准功能)。SensorEvent.values[1] 沿 y 轴的地磁场强度(无硬铁校准功能)。SensorEvent.values[2] 沿 z 轴的地磁场强度(无硬铁校准功能)。SensorEvent.values[3] 沿 x 轴的铁偏差估算。SensorEvent.values[4] 沿 y 轴的铁偏差估算。SensorEvent.values[5] 沿 z 轴的铁偏差估算。 |
Sensor.TYPE_PROXIMITY | 近程传感器 | 单位:厘米SensorEvent.values[0] 与物体的距离。 |
说明:
-
地磁场传感器和近程传感器均基于硬件。
-
除了不使用地磁场,游戏旋转矢量传感器与旋转矢量传感器完全相同。
-
地磁旋转矢量传感器不使用陀螺仪。
-
未经校准的磁力计类似于地磁场 传感器,只不过没有对磁场应用校准。未校准传感器可提供更多原始结果, 包含一些偏差。
设备测试结果:
一加 Ace3:
- 近程传感器(Sensor.TYPE_PROXIMITY)没有捕捉到很多数据,5s 时间仅捕捉到 1 条数据。
- 其他传感器均可以捕捉到较多数据,可以作为熵源的备选。
- 游戏旋转矢量传感器(Sensor.TYPE_GAME_ROTATION_VECTOR)5s 捕捉 1000 条数据。
- 地磁旋转矢量传感器(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR)5s 捕捉 500 条数据。
- 地磁场传感器(Sensor.TYPE_MAGNETIC_FIELD)5s 捕捉 503 条数据。
- 未经校准的磁力计(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED) 5s 捕捉 503 条数据, 每条数据有 6 个数据组成,均有值不为 0。
Pixel 6:
- 游戏旋转矢量传感器 5s 捕捉 1051 条数据。
- 地磁旋转矢量传感器 5s 捕捉 1052 条数据。
- 地磁场传感器 5s 捕捉 503 条数据。
- 未经校准的磁力计 5s 捕捉 503 条数据。
- 近程传感器5s 时间仅捕捉到 1 条数据。
环境传感器
Android 平台提供了环境传感器,可以用来监控相对环境湿度、照度、环境压力和 Android 设备附近的环境温度。
下表中列出了传感器和数据:
类型 | 说明 | 事件数据 |
---|---|---|
Sensor.TYPE_AMBIENT_TEMPERATURE | 温度传感器 | 单位:°CSensorEvent.values[0] 环境空气温度。 |
Sensor.TYPE_LIGHT | 光传感器 | 单位:lxSensorEvent.values[0] 照度。 |
Sensor.TYPE_PRESSURE | 压力传感器 | 单位:hPa 或 mbarSensorEvent.values[0] 环境空气压力。 |
Sensor.TYPE_RELATIVE_HUMIDITY | 湿度传感器 | 单位:%SensorEvent.values[0] 环境相对湿度。 |
上述 4 个环境传感器的以下几点:
- 四个环境传感器均基于硬件 并且只有当设备制造商内置到设备中时才可用。
设备测试结果:
一加 Ace3:
- 光传感器捕捉数据不够灵敏,5s 内仅捕捉到 28 条数据 不适合作为熵源。
- 其他 3 个传感器在设备上没有找到硬件模块。
Pixel 6:
- 光传感器捕捉数据不够灵敏,5s 内仅捕捉到 1 条数据 不适合作为熵源。
- 压力传感器 5s 内仅捕捉到 250 条数据。
- 没有其他传感器。
总结
但从上面两台测试设备上,捕捉灵敏度和数据量的角度看,加速度传感器,陀螺仪(依赖于陀螺仪的 重力传感器,线性加速度传感器,旋转矢量传感器),游戏旋转矢量传感器,地磁旋转矢量传感器,地磁场传感器,未经校准的磁力计 这些传感器可以作为熵源的备选。整个的环境传感器,在手机设备上硬件模块不齐备,且周边环境变化几无变化情况下,无法捕捉有效数据。
对已经测试的手机设备,传感器的排序(也从普及度来看):
- 加速度传感器 —— 普及度高
- 地磁场传感器 —— 低端机型也可以配置磁力计,用以方向确认。
- 陀螺仪(重力传感器,线性加速度传感器,旋转矢量传感器)—— 中高端机型有。
- 游戏旋转矢量传感器 —— 中高端机型上有,数据有赖于 陀螺仪,加速度记和磁力计。
- 地磁旋转矢量传感器 —— 中高端机型有,数据有赖于 陀螺仪 和 加速度记。
- 未经校准的磁力计 —— 普及度低,特定机型或高端机型有。