不可预测的唯一标识符

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

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

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

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

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

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

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

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

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

  RandomNumberGenerator rng = RandomNumberGenerator.Create(); byte[] bytes = new byte[8]; rng.GetBytes(bytes); // produces a string like "4jpKc52ArXU=" var s = Convert.ToBase64String(bytes); 

如何使用ASP.NET用于生成唯一,不可预测和安全的会话ID:

 using System; using System.IO; using System.Web; using System.Web.SessionState; class Program { static void Main() { var request = new HttpRequest("", "http://localhost", ""); var response = new HttpResponse(TextWriter.Null); var context = new HttpContext(request, response); var id = new SessionIDManager().CreateSessionID(context); Console.WriteLine(id); } } 

如果您确实必须具有不可预测性,那么生成GUID并使用128位混频器重新排列这些位。 可能最好使用64位混频器来混合高低部分。 而且,是的,有些混音器可以保证每个独特输入的独特输出。

请注意,这并非完全不可预测。 如果有人在观察知道该值是混淆的GUID,那么他可能会检查连续的值,并且通过一些努力,可能会对您的位混音器进行逆向工程。