随机数生成最安全的种子是什么?

2023-11-25

为随机数生成器提供种子的最安全的熵源是什么?这个问题与语言和平台无关,适用于网络上的任何机器。理想情况下,我正在寻找云环境中的机器或托管公司提供的服务器可用的资源。

有两个重要的弱点需要记住。使用时间发送随机数生成器违反了CWE-337。使用较小的种子空间将违反CWE-339.


以下是一些想法。如果你不耐烦,请跳到最后的结论。

1.什么是安全种子?

Security is defined only relatively to an attack model. We want here a sequence of n bits, that has n bits of entropy with regards to the attacker: in plain words, that any of the possible 2n values for that sequence are equally probable from the attacker point of view.

这是一个与以下相关的模型信息可供攻击者使用。生成和使用种子的应用程序(通常在 PRNG 中)知道确切的种子;种子是否“安全”并不是种子的绝对属性,甚至不是种子生成过程的绝对属性。重要的是攻击者掌握的有关生成过程的信息量。该信息级别根据情况的不同而有很大差异;例如在多用户系统上(例如类 Unix,具有硬件强制的应用程序分离),内存访问的精确计时可以揭示名义上受保护的进程如何读取内存的信息。即使是远程攻击者也可以获得此类信息;这已经是证明了(在实验室条件下)关于 AES 加密(典型的 AES 实现使用内部表,其访问模式取决于密钥;攻击者强制缓存未命中,并通过服务器响应的精确计时来检测它们)。

必须考虑种子的寿命。只要攻击者不知道种子,它就是安全的;此属性必须在之后成立。特别是,不可能从后续 PRNG 输出的摘录中恢复种子。理想情况下,即使在某个时刻获得完整的 PRNG 状态,也不应该提供有关 PRNG 事先生成的任何位的线索。

我想在这里指出的一点是,只有在可以保持安全的上下文中使用种子时,种子才是“安全的”,这或多或少意味着加密安全的 PRNG 和一些防篡改存储。如果这样的存储可用,那么最安全的种子就是生成的种子once,很久以前,并用于由防篡改硬件托管的安全 PRNG 中。

不幸的是,这样的硬件很昂贵(它被称为 HSM,花费几百或几千美元),而且这种成本通常很难证明是合理的(坏种子不会阻止系统运行;这是不可测试性的常见问题)的安全)。因此,通常会选择“主要是软件”的解决方案。由于软件不擅长提供长期的机密存储,因此种子的生命周期被任意缩短:定期获得新的种子。在Fortuna,这样的重新播种应该在生成的伪随机数据的每兆字节中至少发生一次。

总而言之,在没有 HSM 的设置中,使用攻击者无法收集的数据可以相对容易地获得安全种子(因为我们会经常这样做)。

2. 混合

随机数据源不会产生良好的统一位(每个位的值为 1 的概率完全一致)0.5,并且位值彼此独立)。相反,随机源会在特定于源的集合中生成值。这些值可以被编码为位序列,但你的钱并没有物有所值:n熵位,您必须拥有在编码时使用的值远多于n bits.

这里使用的加密工具是PRF它接受任意长度的输入,并产生一个n位输出。这种加密安全的 PRF 被建模为随机预言机:简而言之,在不尝试的情况下预测给定输入的预言机输出的任何内容在计算上是不可行的。

现在,我们有散列函数。哈希函数必须满足一些安全属性,即抵抗原像、第二原像和碰撞。我们通常通过尝试了解它们如何偏离随机预言模型来分析哈希函数。这里有一个重要的点:遵循随机预言模型的 PRF 将是一个很好的哈希函数,但也可以存在良好的哈希函数(在抵抗原像和碰撞的意义上),尽管如此,这些函数很容易与随机预言区分开来。特别是,SHA-2函数(SHA-256、SHA-512...)被认为是安全的,但由于“长度扩展攻击”而偏离了随机预言模型(给定h(m),可以计算出h(米 || 米')对于部分受限的消息m'不知道m)。长度扩展攻击似乎没有为创建原像或冲突提供任何捷径,但它表明这些哈希函数不是随机预言。为了SHA-3 竞赛,NIST表示候选人不应允许这种“长度扩展”。

因此,混合步骤并不容易。现在最好的选择仍然是使用 SHA-256 或 SHA-512,并在选择后切换到 SHA-3(这应该在 2012 年中期左右发生)。

3. 来源

计算机是一台确定性机器。为了获得一些随机性,你必须混合物理世界的一些测量结果。

哲学提示:在某些时候,你必须信任一些聪明的人,他们可能穿着实验室外套或获得报酬进行基础研究。当您使用诸如 SHA-256 之类的哈希函数时,您实际上是在信任一群密码学家,当他们告诉您:我们花了很多年努力寻找缺陷,但一无所获。当你用盖革计数器使用一点正在衰变的放射性物质时,你就相信了一些物理学家的说法:我们非常努力地寻找预测下一个原子内核何时爆炸的方法,但我们没有找到。请注意,在这种特定情况下,“物理学家”包括像贝克勒尔、卢瑟福、玻尔或爱因斯坦这样的人,而“真正的困难”意味着“一个多世纪的积累研究”,所以你在这里并不完全处于未涉足的领域。然而,人们对安全仍然抱有一点信心。

一些计算机已经包含生成随机数据的硬件(即使用和测量物理过程,据物理学家所知,该物理过程是足够随机的)。 VIA C3(一系列 x86 兼容 CPU)就有这样的硬件。奇怪的是,30 年前的家用电脑 Commodore 64 也有一个硬件 RNG(或者是这么说的)维基百科, 至少)。

除非有特殊的硬件,否则您必须使用可能获得的任何物理事件。通常,您会使用击键、传入的以太网数据包、鼠标移动、硬盘访问……每个事件都带有一些数据,并且发生在可测量的瞬间(由于周期计数器,现代处理器具有非常准确的时钟)。这些时刻和事件数据内容可以作为熵源进行累积。对于操作系统本身(可以直接访问硬件)来说,这比对于应用程序来说要容易得多,因此收集种子的正常方法是询问操作系统(在 Linux 上,这称为/dev/random or /dev/urandom【各有利弊,选择你的毒药】;在 Windows 上,调用CryptGenRandom()).

一个极端的情况是 1.2 之前的 Java 小程序,在添加之前java.security.SecureRandom;由于 Java 在将应用程序代码与硬件隔离方面非常有效,因此获取随机种子是一项艰巨的挑战。通常的解决方案是让两个或三个线程同时运行并疯狂地进行线程切换,这样每秒的线程切换数量就有些随机(实际上,这试图通过操作系统调度程序操作的计时来提取随机性,这取决于计算机上也发生的事件,包括与硬件相关的事件)。这是非常不令人满意的。

时间相关措施的一个问题是攻击者也知道当前时间。如果攻击者具有对机器的应用访问权限,那么他也可以读取周期计数器。

有些人建议通过将放大器设置为最大来使用声卡作为“白噪声”源(现在甚至服务器也有音频)。其他人则主张打开网络摄像头的电源(我们知道网络摄像头视频是“嘈杂的”,这有利于随机性,即使网络摄像头面向墙壁);但带有网络摄像头的服务器并不常见。您还可以 ping 外部网络服务器(例如www.google.com)并查看返回需要多长时间(但这可以被监视网络的攻击者观察到)。

使用哈希函数进行混合步骤的优点在于,熵只能累积;添加数据没有什么坏处,即使该数据不是那么随机。通过哈希函数尽可能多地填充。哈希函数非常快(良好的 SHA-512 实现在使用单核的典型 PC 上处理速度超过 150 MB/s),并且播种不会经常发生。

4。结论

Use a HSM。它们要花费几百或几千美元,但你的秘密难道不值钱得多吗? HSM包括RNG硬件,运行PRNG算法,并存储防篡改的种子。此外,大多数 HSM 已获得各种国家法规的认证(例如美国的 FIPS 140 和欧洲的 EAL 级别)。

如果你太便宜而不会购买 HSM,或者如果你想保护实际上不太值得的数据,那么使用通过哈希获得的种子构建一个加密安全的 PRNGlots的物理措施。来自某些硬件的任何内容都应该进行哈希处理,以及获取该数据的时刻(读取“周期计数器”)。您应该在此处按兆字节对数据进行哈希处理。或者,更好的是,做not这样做:只需使用操作系统提供的功能即可,其中已经包含此类代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

随机数生成最安全的种子是什么? 的相关文章

  • 如何生成随机凸多边形?

    我正在尝试设计一种生成随机二维凸多边形的方法 它必须具有以下属性 坐标应该是整数 多边形应位于角为 0 0 和 C C 的正方形内 其中 C 已给出 多边形的顶点数量应接近给定数量 N 例如 生成具有 10 个顶点并位于正方形 0 100
  • 在 Go 中生成随机、固定长度的字节数组

    我有一个字节数组 固定长度为4 token make byte 4 我需要将每个字节设置为随机字节 我怎样才能以最有效的方式做到这一点 这math rand就我而言 方法不提供随机字节函数 也许有一种内置的方法 或者我应该生成一个随机字符串
  • 如何检测CSRF漏洞[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定一个网站 如何检测潜在的 CSRF 漏洞 提前致谢 这是一个CSRF https www owasp org index php
  • ActiveMQ发送ObjectMessage

    我正在使用 ActiveMQ 在我当前的项目中实现消息系统 我需要发送和接收 Java 对象 而不是简单的文本或二进制消息 Java 对象 我的消息对象 根据需要实现了 Serialized 接口 ActiveMQ 的最新版本添加了一些安全
  • JavaScript 中的安全数据

    我必须为 Web 测试创建生成器 使用 HTML 和 JavaScript 测试必须离线和在线进行 正确答案和分数评估必须是生成的测试的一部分 最终用户的分数仅发送到服务器 无法在服务器上进行评估 并且服务器对问题一无所知 它只保存最终分数
  • 支持 API 28(Android Pie) 上的 Android StrongBox 的 Android 智能手机列表

    我需要 Android 9 中支持安全元件和 StrongBox 的 Android 手机列表 在哪里或如何找到该列表 我在 Samsung Galaxy S9 和 AVD Google Pixel XL API 28 上尝试了下面的代码
  • 如何将 pem 公钥转换为 openssl RSA* 结构

    假设我必须像这样公开 pem 密钥 BEGIN PUBLIC KEY MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7vbqajDw4o6gJy8UtmIbkcpnk O3Kwc4qsEnSZp TR fQi
  • 如何在 Web 应用程序中使用 Javascript 安全地访问 Windows Azure 移动服务?

    我需要一本 web javascript 安全入门书 根据如何使用 Windows Azure 移动服务的 HTML JavaScript 客户端 http www windowsazure com en us develop mobile
  • 在哪里可以获得几乎所有英语单词的列表? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想生成一些随机文本 我尝试写一个基本的Java程序 int nowords r nextInt 2000 int i j for i 0
  • 为什么将 MySQL 凭据放在 www 目录之外? [复制]

    这个问题在这里已经有答案了 可能的重复 将核心类放在 Web 根目录之上 好还是坏主意 https stackoverflow com questions 3648739 putting core classes above the web
  • 是否可以在 PHP 中使用 file_get_contents 来破坏 CSRF 令牌验证

    在每个会话的表单上使用令牌的 CSRF 预防方法是一种流行的方法 但是 我不明白这种令牌方式如何保护file get contentsPHP 可以获取跨域文件表单的内容 gt 它可以获取表单上的令牌并使用它 那么这种token方式是如何运作
  • .Net 2.0 ServiceController.GetServices()

    我有一个启用了 Windows 身份验证的网站 从网站的页面中 用户可以启动一项对数据库执行某些操作的服务 启动该服务对我来说效果很好 因为我是服务器上的本地管理员 但我刚刚让一个用户测试了它 但他们无法启动该服务 我的问题是 有谁知道一种
  • 如何在Python中计算输出的均值、众数、方差、标准差等?

    我有一个基于概率的简单游戏 每天我们抛一枚硬币 如果正面朝上 我们就赢了 我们会得到 20 美元 如果我们抛硬币 反面朝上 那么我们会在月底损失 19 美元 28 天 我们可以看到我们失去或赚了多少 def coin tossing gam
  • 清理 html 字符串中的所有脚本

    HTML5 剪贴板很棒 但我正在寻找一种使其安全的方法 用户正在将文本 html 粘贴到我的网页中 这允许他们粘贴图像 表格等 我正在寻找一种方法 在将粘贴的内容添加到页面之前删除所有脚本 我需要删除
  • 是否可以使用流上下文在 PHP 下使用 FTPS?

    我了解到使用ftpsPHP for Windows 下的 ftp ssl connect 很困难 您被要求进入构建自己的二进制文件以包括 Open SSL 的漫长旅程 我找到了以下建议phpseclib http phpseclib sou
  • 存储外部站点(不使用 OAuth)的用户凭据的智能方法是什么?

    我意识到 一般来说 您不应该直接存储用户凭据 即以纯文本形式 相反 最好存储它们的某种加密形式 但是 假设我创建了一个与其他第三方网站交互的网站 假设这个第 3 方站点提供了一个 API 需要用户的凭据 使用该站点 进行身份验证 如果我的目
  • 受信任的 1.5 小程序可以执行系统命令吗?

    如果是的话 这个能力有什么限制吗 具体来说 我需要以 Mac OSX 为目标 我以前用过这个在 Windows 系统上启动东西 但从未在 Mac 上尝试过 public void launchScript String args Strin
  • 这个方法比 Math.random() 更快吗?

    我是一名初学者 目前已经开始开发一款使用粒子群优化算法的 Android 游戏 我现在正在尝试稍微优化我的代码 并且 for 循环中有相当多的 Math random 几乎一直在运行 所以我正在考虑一种方法来绕过并跳过所有 Math ran
  • 在 Swift 中使用 CommonCrypto 解密时出现问题

    我在一家Swift only加密 解密Extension for String and NSData 并且 crypt 部分的工作基于 Zaph 在链接问题中提供的答案 在 Swift 中使用 CCCrypt CommonCrypt 时出现
  • 在MySQL中生成随机字符串

    我正在尝试使用函数在 phpmyadmin 中获取随机字符串 我有以下代码 CREATE FUNCTION randomPassword RETURNS varchar 128 BEGIN SET chars ABCDEFGHIJKLMNO

随机推荐

  • 如何使窗口出现在所有内容之上(甚至是全屏游戏!)c++/Qt

    我正在尝试制作一个在屏幕中心显示十字准线并保持在其他所有内容之上的应用程序 目的是在一些不提供十字准线的 FPS 游戏中添加十字准线 我已经成功地将我的窗口设置为除了游戏之外的所有内容的最上面 这是我的代码 一切都在主要部分 因为我只测试我
  • 当前 Android Google Spreadsheet API 编写示例

    我正在寻找一个编写 Google 电子表格并从 Android 向其中添加行的示例 到目前为止 我发现的所有示例都已过时 仅包含身份验证 或仅列出文档 电子表格 不包含任何写入 您知道创建电子表格并向其中添加行的任何示例吗 以下是适用于 G
  • Java TreeMap 比较器

    我需要一个 TreeMap 的比较器 我应该在 TreeMap 的构造函数中匿名编写此代码吗 我还能怎么写我的比较器 目前 Java 不喜欢我的代码 我可以匿名执行此操作吗 SortedMap
  • 如何为另一个数据库执行存储过程?

    我有一个存储过程 应该能够在我的 MS Sql Server 上的任何数据库的任何表上执行 大多数 EXEC 和 USE 语句的组合不会产生任何结果 这是存储过程 CREATE PROCEDURE dbo usp TrimAndLowerC
  • R 成对乘积

    我正在尝试获取向量的成对乘积 例如 a c 1 2 3 4 我想要得到的是 2 3 4 6 8 12 按顺序 我尝试过使用外部 outer 1 4 2 4 这给了我一个矩阵 其中包含我想要的产品 但我不确定如何以缩放到更高维度向量的方式从矩
  • 在具有大型 C 文件的 vim 中启用语法和语法折叠会导致完成速度变慢

    当我在一个大的 C 文件 大约 8000 行中有语法时 完成ctrl p和ctrl n非常慢 超过20 当我关闭语法时 完成时间不到一秒钟 我找到了重现这种行为的最小方法 使用空的 vim 文件夹并创建仅包含以下行的 vimrc set s
  • 如何让CSV阅读器读取内存文件?

    我正在尝试将整个文件提取到内存中 完成 使用 StringIO 但据我所知 这些对象的行为并不完全像 真实 文件 我得到了整个内容 或者我可以读取一次一行 但我不知道如何应用此模式 import csv with open MYMEMORY
  • 如何使用 simple_form 生成 input[type=date]?

    当我做f input start date as date我得到 3 个选择元素 日 月和年 我可以f input start date as string to get input type text 元素 但我怎样才能生成input t
  • 订阅或绑定现有的Intent服务

    我有一个应用程序 它的初始活动会在列表视图中列出一些文件 单击列表中的某个项目时 您将看到该特定文件的详细活动 在详细视图中 我有一个名为下载的按钮 当您单击下载时 它会启动一个 IntentService 该 IntentService
  • 第一次使用 MongoDB + Docker - 从 docker compose 设置

    我想尝试一下project我在 GitHub 上找到了 所以我在 MacOS 上安装了 MongoDB 现在我试图了解如何通过目录中的 docker compose 文件正确设置它 这是泊坞窗文件 version 3 services re
  • 代码完成不适用于远程文件(使用 RSE)

    What is 在主机上 Windows 7的 面向 PHP 开发人员的 Eclipse版本 Helios 服务版本 2 在访客机器上 Linux Debian 挤压 我想使用 RSE 在 Eclipse 中通过 SSH 编辑我的远程项目
  • 我什么时候应该使用 Perl 的 AUTOLOAD?

    In Perl 最佳实践 AUTOLOAD 部分的第一行是 不要使用自动加载 然而 他描述的所有案例都涉及面向对象或模块 我有一个独立的脚本 其中一些命令行开关控制定义特定函数的哪些版本 现在我知道我可以将条件和评估放在文件顶部 然后再进行
  • 您可以覆盖 scala @serialized 对象中的流编写器吗?

    我现在明白了 scala serialized 对象可以像 Java Serialized 对象一样使用 在 Java Serialized 对象中 您可以重写一些方法来更改对象的流式传输方式 writeObject ObjectOutpu
  • 如何在 JavaScript 中使用 ISO 8601 格式化带有时区偏移的日期?

    Goal 找出local time and UTC time offset然后按以下格式构造 URL 示例网址 Actions Sleep duration 2002 10 10T12 00 00 05 00 该格式基于W3C 推荐 文档说
  • 将 Cassandra BoundStatement 的 ResultSet 映射/转换/转换为使用对象映射 API 构建的 Java 类的最有效方法是什么?

    DataStax Java for Apache Cassandra 中是否有内置方法可以将来自 BoundStatement 的 ResultSet 映射到使用对象映射 API 构建的域对象 Java 类 我是从 Mapper Acces
  • div 清除后 IE 中的额外垂直空间

    我通过左浮动创建了一个简单的 div 网格 并在每行末尾创建了一个空的 div 这在 Firefox 中工作正常 但在 IE 中我在行之间获得了额外的垂直空间 我尝试应用 clearfix 方法 但我一定做错了什么 为什么 IE 会插入多余
  • 跟踪 Python 导入

    我的 Python 库刚刚更改了它的主模块名称foo bar to foobar 为了向后兼容 foo bar仍然存在 但导入它会引发一些警告 现在 似乎一些示例程序仍然从旧模块导入 但不是直接导入 我想找出错误的地方import陈述 有没
  • U后缀的含义

    后缀 或后缀 有什么作用U以下值的平均值 0U 100U 它代表unsigned 声明常量时 还可以指定其类型 另一个常见的例子是L 这代表long 并且您必须将其放置两次才能指定 64 位常量 例子 1ULL 它有助于避免显式强制转换
  • 如何打乱 ArrayList [重复]

    这个问题在这里已经有答案了 我需要一些帮助来编写一个对 ArrayList 进行洗牌的方法 我不知道该在我的方法中放置什么 这是我到目前为止所拥有的 我尝试使用随机方法来随机化列表中的整数 但这不起作用 有人可以告诉我该怎么做吗 这是我尝试
  • 随机数生成最安全的种子是什么?

    为随机数生成器提供种子的最安全的熵源是什么 这个问题与语言和平台无关 适用于网络上的任何机器 理想情况下 我正在寻找云环境中的机器或托管公司提供的服务器可用的资源 有两个重要的弱点需要记住 使用时间发送随机数生成器违反了CWE 337 使用