System.Guid.NewGuid() 的随机性如何? (拿两个)

2023-12-02

在开始将其标记为之前重复的,读给我听。另一个问题有一个(很可能)不正确的接受答案。

我不知道 .NET 如何生成它的 GUID,可能只有 Microsoft 这样做,但它很可能只是调用CoCreateGuid()。然而,该函数被记录为正在调用Uuid创建()。创建 UUID 的算法是有据可查.

长话短说,无论如何,似乎System.Guid.NewGuid()确实使用版本 4 UUID 生成算法,因为它生成的所有 GUID 都符合条件(您自己看看,我尝试了几百万个 GUID,它们都匹配)。

换句话说,这些 GUID 是almost随机的,除了一些已知的位。

这又提出了一个问题——随机性如何IS这个随机?每个优秀的小程序员都知道,伪随机数算法的随机性取决于其种子(又名熵)。那么种子是做什么用的UuidCreate()? PRNG 多久重新播种一次?它的加密强度是否强大,或者如果两台计算机意外调用,我是否可以期望相同的 GUIDes 开始倾泻而出System.Guid.NewGuid()同时?如果收集到足够多的连续生成的 GUID,是否可以猜测 PRNG 的状态?

Added:为了澄清,我想知道我可以相信它是多么随机,因此 - 我可以在哪里使用它。因此,让我们在这里建立一个粗略的“随机性”尺度:

  1. 基本随机性,以当前时间为种子。可用于在纸牌游戏中洗牌,但除此之外就没什么用了,因为即使不尝试也很容易发生碰撞。
  2. 更高级的随机性,不仅使用时间,还使用其他机器特定的因素作为种子。也许也只在系统启动时播种一次。这可用于在数据库中生成 ID,因为不太可能出现重复。不过,这对安全性不利,因为只要付出足够的努力就可以预测结果。
  3. 密码随机,使用设备噪声或其他高级随机源作为种子。每次调用时或至少经常重新播种。可用于会话 ID、分发给不受信任的各方等。

我在思考是否可以将它们用作数据库 ID 以及是否可以使用它们时想到了这个问题指南梳算法实现连同System.Guid.NewGuid()(就像 NHibernate 所做的那样)是否有缺陷。


答案是:您不需要知道这一点。正如已接受的答案中所述相关问题:

GUID 并不保证随机性,而是保证唯一性。

关于安全性和随机性的更强有力的声明是RFC4122,它指定了 UUID 格式:

不要假设 UUID 很难猜测;不应该使用它们 作为安全功能(仅拥有即可授予的标识符 访问),例如。可预测的随机数源将 加剧局势。

其他任何内容都是实现细节(并且可能会发生变化)。

Windows 细节

通常,人们声称 Windows 上的行为已记录下来,因此可以保证 GUID 的加密安全。

现已存档[MS-SECO] Windows 安全概述附录 A 中提到的文件:

尽管只有一小部分版本 4 GUID 需要 加密随机性,获得 Windows 内置的所有版本 4 GUID 的随机位 通过 Windows CryptGenRandom 加密 API 或等效的、使用的相同源 用于生成加密密钥。

此外,同一文档的第 2.5.5 节明确提到使用“秘密 GUID”值作为随机数或验证器。

但是:这段产品行为文档并不是您通常可以作为产品安全性基础的规范(特别是在 .NET 环境中)。

事实上,上面的文档描述了一个实施细节 of a 特定产品。 即使当前的 Windows 和 .NET Framework 4.x 实现在 Windows 上生成真正随机的版本 4 UUID 值,也不能保证System.Guid.NewGuid将来或在其他 .NET 平台(例如 Mono、Silverlight、CF、.NET Core 等)上都会这样做。

举个例子,.NET Core早期版本使用的UUID算法取决于平台您可能会获得版本 1 UUID(在 BSD 上)。

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

System.Guid.NewGuid() 的随机性如何? (拿两个) 的相关文章

  • 如何正确转义mysql?

    我刚刚发现如果我写 select from tbl where name like foo 然后添加 foo 作为参数及其值 a 用户数据 它不会正确转义 我勒个去 它想要 a 即使我使用参数 我还是忍不住觉得我对 sql 注入持开放态度
  • 为什么当要求修剪“PRN.NUL”时,TrimStart 会更多地修剪字符?

    这是代码 namespace TrimTest class Program static void Main string args string ToTrim PRN NUL Console WriteLine ToTrim string
  • 如何等待远程 .NET 调试器连接

    今天我遇到了一个问题 我需要远程调试程序 该程序是从另一个系统启动的 所以我真的没有机会在命令行上与它交互 不过我可以很容易地改变它的来源 我需要做的是让程序正常启动 然后等待我用调试器附加到它 我想不出一个让我快乐的方法 我确实发现了这个
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 如何在完成之前从 ReplaySubject 获取最新值

    我需要一种方法来获取添加到 ReplaySubject 中符合特定条件的最新项目 下面的示例代码完成了我需要它做的事情 但感觉不是正确的方法 static void Main string args var o new ReplaySubj
  • 防止重入并确保某些操作获取锁的正确方法是什么?

    我正在设计一个基类 当继承该基类时 它将针对多线程环境中的上下文提供业务功能 每个实例可能都有长时间运行的初始化操作 所以我想让这些对象可重用 为此 我需要能够 为这些对象之一分配上下文以允许其完成工作 防止对象在已有上下文的情况下被分配新
  • 如何有效确保小数值至少有 N 位小数

    我想在进行算术运算之前有效地确保十进制值至少有 N 个位置 在下面的示例中 3 显然我可以格式化 0 000 然后解析 但它的效率相对较低 我正在寻找一种避免与字符串转换的解决方案 我尝试过以下解决方案 decimal d 1 23M d
  • 如何消除字符串中的所有换行符?

    我需要删除字符串中出现的所有换行符 来自数据库 我使用下面的代码来做到这一点 value Replace r n Replace n Replace r 我可以看到至少有一个角色的行为就像行尾一样幸存了下来 字符代码是8232 http w
  • 由于索引无效,无法加载计数器名称数据 -Exception

    我使用 C 和 WPF 操作系统是 windows 7 Professional 和 Visual Studio 2012 SQL Server 2012 我在wpf中使用了Devexpress Grid 我想使用 ADO Net 服务器模
  • 以编程方式设置 maxRequestLength

    有一个配置值叫做maxRequestLength 在配置文件中 它看起来像这样
  • 自定义代码访问安全属性

    我创建了以下属性 Serializable AttributeUsage AttributeTargets Class AttributeTargets Method AllowMultiple true Inherited true pu
  • 如何计算最低系统要求?

    对于我用 Visual C 编写的应用程序 Testing 不 真的 这就是全部
  • 什么时候值得使用 BindingSource?

    我想我非常了解 BindingSource 类的作用 即在数据源和 UI 控件之间提供一个间接层 它实现了 IBindingList 接口 因此还提供了对排序的支持 而且我已经经常使用它 没有太多问题 但我想知道我使用它的频率是否超过了应有
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 在 SQL Server 中,如果主键是 GUID,如何按插入顺序对表行进行排序?

    我开始在主键中使用 GUID 而不是自动增量整数 然而 在开发过程中 我习惯于查询 从 SQL Management Studio 或 Visual Studio 数据库 以查看我的应用程序刚刚插入的记录 并且我对无法按主键 desc 顺序
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐