我想在. NET中创建加密安全GUID(v4)。
.NET的Guid.NewGuid()
函数在加密方面并不安全,但.NET确实提供了System.Security.Cryptography.RNGCryptoServiceProvider
类。
我希望能够将一个随机数函数作为委托传递给Guid.NewGuid
(或者甚至传递一些提供生成器接口的类),但看起来这在默认实现中是不可能的。
我可以通过同时使用System.GUID
和System.Security.Cryptography.RNGCryptoServiceProvider
来创建加密安全的GUID吗?
6条答案
按热度按时间pw136qt21#
是的,Guid允许您使用字节数组创建Guid,并且RNGCryptoServiceProvider可以生成随机字节数组,因此您可以使用输出来提供新的Guid:
chhqkbe12#
阅读下面布拉德M的回答:https://stackoverflow.com/a/54132397/113535
如果有人感兴趣,这里是上述示例代码调整为.NET核心1.0(DNX)
gblwokeq3#
https://www.rfc-editor.org/rfc/rfc4122表示有几个位需要修改,以指示此GUID是版本4(随机)GUID,下面是设置/取消设置这些位的代码。
3hvapo4f4#
如果你使用的至少是c#7.2和netcoreapp2.1(或
System.Memory
),这是最快/最有效的方法。我创建了一个基准测试,将其与公认的答案进行比较。我修改它以使用
RandomNumberGenerator
的静态实现,因为GetBytes()
是线程安全的。(尽管我看到的唯一保证是RNGCryptoServiceProvider
具有线程安全的实现......但其他实现可能没有)x一个一个一个一个x一个一个二个x
biswetbf5#
2020修订版
我发现@rlamoni的answer非常棒,只是需要在它的位操作中做一点修改,以正确地反映GUID版本4的标识位,从而同时考虑到Big Endian和Little Endian架构。
更具体地说,我的答复中的更正如下:
1.修改的字节应为第7和第9个。
1.已更正按位与操作数。
更新
正如用户Benrobot所指出的,guid是无效的。我想是因为他的设备Endianness与我的不同。
这促使我进一步完善我的答案。除了我在上面的原始答案中指出的两处更正外,这里还有几处对我的答案的完善:
1.占当前计算机体系结构的Endianness。
1.添加了自解释常量和变量标识符,而不是常量文字。
1.使用不需要大括号的simple
using statement
。1.添加了一些注解并要求
using directive
。在线验证器
要检查生成的GUID的有效性:
参考文献
Uuid.cs
C#class.p3rjfoxz6#
om-ha的答案非常好,但我想针对.NET 5.0进行优化,因为它不需要RNG加密提供程序,我针对.NET 5.0的修改版本如下:
这里的编辑使用
RandomNumberGenerator
(Docs),Fill
方法执行以下操作:用加密的强随机字节填充范围