不可预测的唯一标识符

Kel*_*Kel 5 c#

对于我正在处理的应用程序,我需要生成一个必须具有以下属性的会话令牌:

  • 它至少应该是应用程序的独特之处,全球唯一性会更好
  • 它应该是不可预测的
  • 它不应该太长,因为它必须在http请求标头中传递,所以越小越好

我正在考虑使用加密随机数来调整Guid结构,但这可能是一种过度杀伤力.有人知道/创建了适合所有这些属性的数据结构吗?

Eri*_*ert 28

让我在这一点上非常清楚.所有使用GUID的答案都是错误的,在任何情况下都不应该这样做.

GUID规范中没有任何内容要求攻击者无法预测.如果以块分配,则允许GUID是顺序的,允许使用非加密强度随机性创建GUID,并且允许根据关于世界的已知事实创建GUID,例如MAC地址和当前时间. 没有任何要求GUID是不可预测的.

如果您需要一个不可预测的会话密钥,那么使用加密强度随机数生成器生成一个密钥以生成足够多的位.

更一般地说:使用正确的工具来完成工作,特别是在涉及影响安全性的代码时.GUID旨在确保两家公司不会意外地将相同的标识符提供给两个不同的接口.如果那是您的应用程序,请为其使用GUID.发明GUID是为了防止良性实体发生意外,而不是为了保护无辜用户免受坚决的攻击者.GUID就像停车标志 - 防止意外碰撞,防止攻击坦克.

GUID 并非旨在解决除事故预防之外的任何问题,因此在任何情况下都不要使用它们来解决加密问题.使用专门为解决您的问题而设计的加密库,由世界一流的专家实施.

  • @ErikPhilips:v4 guids不保证是*crypto strength random*,有些位根本不是随机的.我的观点是**不要使用专为独特性设计的东西作为不可预测性的来源**.使用工具来实现它们的目的. (3认同)
  • @ErikPhilips:这仍然是*无法解决生成会话密钥的问题.Guids,无论它们是如何生成的,都用于*防止良性实体之间的冲突*,而不是*保护会话内容免受攻击者的攻击.***在安全方面,使用专为手头任务设计的工具.**这是聪明而安全的事情. (2认同)

Jef*_*ata 7

您可以使用加密的 RandomNumberGenerator,然后获取要生成适当长度的标识符的许多字节.

    RandomNumberGenerator rng = RandomNumberGenerator.Create();

    byte[] bytes = new byte[8];
    rng.GetBytes(bytes);

    // produces a string like "4jpKc52ArXU="
    var s = Convert.ToBase64String(bytes);
Run Code Online (Sandbox Code Playgroud)

  • 我使用大约16个字节的哈希值.8字节哈希的冲突可能在几十亿个条目中发生.但代码本身就是我所使用的. (2认同)