【发布时间】:2010-12-23 09:38:33
【问题描述】:
我们目前正在使用 .NET 的 Guid.NewGuid() 来生成激活码和 API 密钥。我想知道这是否会带来安全问题,因为他们的算法是开放的。
.NET Guid 使用 Win32 CoCreateGuid,我不知道它的内部结构(可能是 MAC 地址 + 时间戳?)。有人可以从第一个 GUID 中推导出第二个 GUID,还是他可以通过一些聪明的猜测来达到它,或者随机性是否足够好,以至于搜索空间变得太大?
生成随机密钥存在冲突问题,在添加到数据库之前需要仔细检查。这就是我们坚持使用 GUID 的原因,但我不确定它们的安全性。
这是 4 个连续的 UUIDGEN 输出:
c44dc549-5d92-4330-b451-b29a87848993 d56d4c8d-bfba-4b95-8332-e86d7f204c1c 63cdf958-9d5a-4b63-ae65-74e4237888ea 6fd09369-0fbd-456d-9c06-27fef4c8eca5
这是Guid.NewGuid()的其中4个:
0652b193-64c6-4c5e-ad06-9990e1ee3791 374b6313-34a0-4c28-b336-bb2ecd879d0f 3c5a345f-3865-4420-a62c-1cdfd2defed9 5b09d7dc-8546-4ccf-9c85-de0bf4f43bf0
【问题讨论】:
-
关于 guid 的 Wikipedia 在 guid 算法上相当不错:en.wikipedia.org/wiki/Globally_unique_identifier
-
Cody,它很相似,但我并不是严格寻找随机性本身。例如,GUID 可能是一个非常高精度的计时器,并且仍然是安全的而不是随机的。我想知道的是,连续 GUID 之间的搜索空间是否足够宽且不可预测,足以进行微不足道的蛮力攻击。