本文将提供关于 OneKey App(软件钱包)生成钱包助记词过程中随机数的安全性测试报告,涵盖了所有 OneKey App 支持的操作系统(macOS, Windows, Andriod, iOS)及相应客户端(Desktop & Extension)的测试结果。
测试结论
OneKey App 在 Windows、macOS、iOS、Android 平台的客户端和 Chrome 插件端中,均采用了对应平台开发指南推荐的符合密码学强度的随机数 API,经过内部测试符合 NIST SP 800-22 及 FIPS 140-2 随机数安全标准。
- 在基于 Chrome 内核的 Windows,macOS 平台中使用了由 Chrome 提供的安全伪随机数 API crypto.getrandomvalues 获取足够密码学强度的伪随机数。
- 在基于 React Native 的 Android 和 iOS 平台中,则分别调用了系统原生提供的安全随机接口SecureRandom 和 SecRandomCopyBytes。
⚠️ 注意:虽然 OneKey App 完全遵从安全开发指引,但用户自身设备操作系统/硬件实现同样也会影响最终随机数生成的安全性。
随机数安全测试
NIST SP 800-22 (National Institute of Standards and Technology Special Publication 800-22) 是一份由美国国家标准与技术研究院(NIST)发布的文档,主要涉及用于测试伪随机数生成器(PRNG)的统计测试套件。它提供了一组统计测试,用于评估随机数生成器产生的比特序列的随机性和质量。
- 测试软件:NIST SP 800-22 Statistical Test Suite
- 测试环境:macOS 14.5
- 测试参数:
项目 |
参数 |
---|---|
段长度 |
1024000 |
测试项目 |
1(指进行全部 15 项测试) |
Block Frequency Test - block length(M) |
20480 |
NonOverlapping Template Test - block length(m) |
10 |
Overlapping Template Test - block length(m) |
10 |
Approximate Entropy Test - block length(m) |
10 |
Serial Test - block length(m) |
16 |
Linear Complexity Test - block length(M) |
5000 |
bitstreams |
20(20*1024000bits = 20480000bits = 20MB) |
测试平台信息:系统 Win10 22H2;硬件 i7-13700h
-
桌面客户端
- 由于 Windows 的 OneKey App 桌面端为 electron 应用依赖 Chrome 内核进行工作,通过开发者工具,在 runtime 中调用助记词随机熵生成 API:crypto.getrandomvalue,对随机数进行取样,总计 20MB。按照测试参数进行测试,「测试报告」如下方附件所示,所有项目均通过测试符合安全要求。
- 测试结果:NIST SP 800-22-windows-desktop-wini713.txt(可在文章附件中下载查看)
-
浏览器插件
- 由于浏览器插件依赖 Chrome 内核进行工作,通过开发者工具,在 runtime 中调用助记词随机熵生成 API:crypto.getrandomvalue,对随机数进行取样,总计 20MB。按照测试参数进行测试,「测试报告」如附件所示,所有项目均通过测试符合安全要求。
- 测试结果:NIST SP 800-22-windows-ext-wini713.txt(可在文章附件中下载查看)
测试平台信息:系统 Sonoma 14.6;硬件 MacBook Pro 2020 13-inch M1
-
桌面客户端
- 由于 macOS 的 OneKey App 桌面端为 electron 应用依赖 Chrome 内核进行工作,通过开发者工具,在 runtime 中调用助记词随机熵生成API:crypto.getrandomvalue,对随机数进行取样,总计 20MB。按照测试参数进行测试,「测试报告」如下方附件所示,所有项目均通过测试符合安全要求。
- 测试结果:NIST SP 800-22-macOS-desktop-macm1p.txt(可在文章附件中下载查看)
-
浏览器插件
- 由于浏览器插件依赖 Chrome 内核进行工作,通过开发者工具,在 runtime 中调用助记词随机熵生成 API:crypto.getrandomvalue,对随机数进行取样,总计 20MB。按照测试参数进行测试,「测试报告」如附件所示,所有项目均通过测试符合安全要求。
- 测试结果:NIST SP 800-22-macOS-ext-macm1p.txt(可在文章附件中下载查看)
测试平台信息:系统 hyperOS 1.0.4.0;硬件 Xiaomi 10s snapdragon870
-
Android 端
- 由于 OneKey App 的 Andriod 端为 React Native 应用依赖 Native API 进行工作,在 Android 端应用调用 crypto.getrandomvalue 时实际由系统 API SecureRandom 提供服务。通过 React remote js debug,在 runtime 中调用助记词随机熵生成 API:crypto.getrandomvalue,对随机数进行取样,总计 20MB。按照测试参数进行测试,「测试报告」如附件所示,所有项目均通过测试符合安全要求。
- 测试结果:NIST SP 800-22-android-app-andsm870.txt(可在文章附件中下载查看)
测试平台信息:系统 IOS 17.5;硬件 iPhoneX A11
-
iOS 端
- 由于 iOS 端为React Native 应用依赖 Native API 进行工作,在 iOS 端应用调用crypto.getrandomvalue 时实际由系统 API SecRandomCopyBytes 提供服务。通过 React remote js debug,在 runtime 中调用助记词随机熵生成 API:crypto.getrandomvalue,对随机数进行取样,总计 20MB。按照测试参数进行测试,「测试报告」如附件所示,所有项目均通过测试符合安全要求。
- 测试结果:NIST SP 800-22-iOS-app-x.txt(可在文章附件中下载查看)
FIPS 140-2 是美国联邦信息处理标准(Federal Information Processing Standard,简称 FIPS)第 140-2 号标准的简称。这是一个由美国国家标准与技术研究院(NIST)制定的计算机安全标准,主要用于加密模块的安全要求。其中 4.7.1 节及父章节内容,主要从 RNG 类型、安全强度、种子、熵、周期性、周期测试、连续性测试等方面对随机数生成器提出要求。
- 测试软件:rng-tools
- 测试参数:无
- 测试环境:ubuntu 24.04 arm64
- 编译流程:
- 正确安装 gcc、automake
- 执行 ./autogen.sh
- 执行 ./configure(若报错,请按照报错内容配置依赖环境)
- 执行 make 得到编译文件 rngd 和 rngtest
- 执行 ./rngtest < testfile.bin
⚠️ 注意:测试文件需要以 bin 作为输入,而非 ASCII 格式输入。
测试平台信息:系统 Win10 22H2;硬件 i7-13700h
-
桌面客户端
- 由于 Windows 的 OneKey App 桌面端为 electron 应用依赖 Chrome 内核进行工作,通过开发者工具,在 runtime 中调用助记词随机熵生成 API:crypto.getrandomvalue,对随机数进行取样,总计 20MB。将文本文件转换为二进制文件,「测试报告」如下图所示,所有项目均通过测试符合安全要求。
-
浏览器插件
- 由于浏览器插件依赖 Chrome 内核进行工作,通过开发者工具,在 runtime 中调用助记词随机熵生成 API:crypto.getrandomvalue,对随机数进行取样,总计 20MB。将文本文件转换为二进制文件,「测试报告」如下图所示,1024 轮测试中 Runs 存在一轮不合格,所有项目均通过测试符合安全要求。
测试平台信息:系统 Sonoma 14.6;硬件 MacBook Pro 2020 13-inch M1
-
桌面客户端
- 由于 macOS 的 OneKey App 桌面端为 electron 应用依赖 Chrome 内核进行工作,通过开发者工具,在 runtime 中调用助记词随机熵生成API:crypto.getrandomvalue,对随机数进行取样,总计 20MB。将文本文件转换为二进制文件,「测试报告」如图所示,所有项目均通过测试符合安全要求。
-
浏览器插件
- 由于浏览器插件依赖 Chrome 内核进行工作,通过开发者工具,在 runtime 中调用助记词随机熵生成 API:crypto.getrandomvalue,对随机数进行取样,总计 20MB。将文本文件转换为二进制文件,「测试报告」如下图所示,所有项目均通过测试符合安全要求。
测试平台信息:系统 hyperOS 1.0.4.0;硬件 Xiaomi 10s snapdragon870
-
Android 端
- 由于 OneKey App 的 Andriod 端为 React Native 应用依赖 Native API 进行工作,在 Android 端应用调用 crypto.getrandomvalue 时实际由系统 API SecureRandom 提供服务。通过 React remote js debug,在 runtime 中调用助记词随机熵生成 API:crypto.getrandomvalue,对随机数进行取样,总计 20MB。将文本文件转换为二进制文件,「测试报告」如下图所示,1024 轮测试存在三轮全部测试项失败,所有项目均通过测试符合安全要求。
⚠️ Android 端存在 1024 轮测试中,有三轮测试存在所有测试项目均不通过的问题。此问题可能为 rng-test 测试工具自身 bug,这三轮测试不对测试结论产生影响。
测试平台信息:系统 IOS 17.5;硬件 iPhoneX A11
-
iOS 端
- 由于 iOS 端为React Native 应用依赖 Native API 进行工作,在 iOS 端应用调用crypto.getrandomvalue 时实际由系统 API SecRandomCopyBytes 提供服务。通过 React remote js debug,在 runtime 中调用助记词随机熵生成 API:crypto.getrandomvalue,对随机数进行取样,总计 20MB。将文本文件转换为二进制文件,「测试报告」如下图所示,1024 轮测试中存在 Long run 一轮不合格,所有项目均通过测试符合安全要求。