我有一个WCF Web服务,它检查用户是否有效.
如果用户有效,我想生成一个在24小时后过期的令牌.
public bool authenticateUserManual(string userName, string password,string language,string token)
{
if (Membership.ValidateUser(userName,password))
{
//////////
string token = ????
//////////
return true;
}
else
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud) GUID在为Web应用程序创建会话密钥时会得到很多使用.我一直想知道这种做法的安全性.由于GUID是根据来自机器的信息和时间以及其他一些因素生成的,因此猜测未来可能会出现的GUID有多难.假设您已经启动了1000个或10000个新会话,以获得正在生成的GUID的良好数据集.这是否会使生成可能用于另一个会话的GUID变得更容易.您甚至不必猜测特定的GUID,而只是继续尝试可能在特定时间段生成的GUID.
请注意,这不是我的应用程序,它是我正在为客户端测试的应用程序.我通常会在https://security.stackexchange.com/上提出这样的问题,但是因为这是我在这里提出的更多编程相关问题.
当然,UUID的RFC 4122没有规定必须由密码安全伪随机数发生器(CSPRNG)生成类型4 UUID.它简单地说
将所有其他位设置为随机(或伪随机)选择的值.
虽然,算法的某些实现(例如Java中的这种实现)确实使用CSPRNG.
我试图深入研究微软的实施是否成功.主要围绕.NET或MSSQL Server如何生成它们.
检查.NET源代码,我们可以看到以下代码:
Marshal.ThrowExceptionForHR(Win32Native.CoCreateGuid(out guid), new IntPtr(-1));
return guid;
Run Code Online (Sandbox Code Playgroud)
检查CoCreateGuiddocco,它说
CoCreateGuid函数调用RPC函数UuidCreate
我能找到关于这个功能的所有内容都在这里.我好像已经到了兔子洞的尽头.
现在,有没有人知道如何UuidCreate生成其UUID?
我见过很多相关帖子:
第一个说:
GUID不保证随机性,它保证了唯一性.如果您想要随机性,请使用Random生成字符串.
我同意这一点,除了在我的情况下随机,不可预测的数字,你当然使用CSPRNG而不是Random(例如RNGCryptoServiceProvider).
而后者的状态(实际上引自维基百科):
WinAPI GUID生成器的密码分析显示,因为V4 GUID的序列是伪随机的; 在完全了解内部状态的情况下,可以预测先前和后续的值
现在,在围栏的另一边,Will Dean说这篇文章
我最后一次研究这个问题(几年前,可能是XP SP2),我直接进入操作系统代码,看看实际发生了什么,并使用安全随机数生成器生成一个随机数.
当然,即使它当前正在使用CSPRNG,这也将是特定于实现的,并且可能随时更改(例如,对Windows的任何更新).不太可能,但理论上可行.
我的观点是,没有规范的参考,以上是为了证明我已经完成了我的研究,上述帖子都没有引用任何权威的内容.
原因是我正在尝试确定是否需要更改使用GUID进行身份验证令牌的系统.从纯粹的设计角度来看,答案肯定是肯定的,但是从实际的角度来看,如果Windows UuidCreate功能确实使用了CSPRNG,那么系统就没有直接的风险.任何人都可以对此有所了解吗?
我正在寻找有信誉的来源的任何答案来支持它.
我的最终目标是创建一个唯一且无法猜测/预测的URL.此URL的目的是允许用户执行验证其电子邮件地址和重置密码等操作.这些URL将在设定的时间内过期(目前设置为24小时).
我最初是Guid为了这个目的而使用的,但我现在明白这是介于"很好"和"非常不安全"之间,取决于你听的专家.所以,我想我会加强我的代码,为了以防万一.起初我以为我只是坚持使用a Guid,但是从随机字节而不是Guid.NewGuid()工厂方法生成它.这是我提出的方法:
public static Guid GetRandomGuid()
{
var bytes = new byte[16];
var generator = new RNGCryptoServiceProvider();
generator.GetBytes(bytes);
return new Guid(bytes);
}
Run Code Online (Sandbox Code Playgroud)
我不太清楚当你使用new Guid(bytes)而不是Guid.NewGuid(),但是我认为所有这个方法都会生成一个随机字节数组并将其存储在Guid数据结构中.换句话说,它不再保证是独一无二的,它只能保证是随机的.
由于我的网址必须既独特又随机,这似乎不是一个可靠的解决方案.我现在想,我应该将我的URL基于一个唯一ID(可以是Guid或者,如果可用,数据库自动增加的id)和生成的随机序列的组合RNGCryptoServiceProvider.
问题
什么是生成验证/密码重置URL的最佳方法,该URL既保证唯一又极难/无法预测/猜测?
我应该通过将唯一字符串与随机字符串连接来构建我的URL吗?
.NET Framework是否具有内置方法,可以轻松生成可用于URL 的唯一且随机(不可预测)的序列?
如果没有,是否有一个很好的解决方案可用开源?
更新
如果有人有类似的要求,我目前正在使用以下方法:
public static string GenerateUniqueRandomToken(int uniqueId)
// generates a unique, random, and alphanumeric token
{
const string availableChars =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
using (var generator = new …Run Code Online (Sandbox Code Playgroud)