.net 如何安全地创建重置密钥和登录令牌?

.net 如何安全地创建重置密钥和登录令牌?,.net,security,.net,Security,在过去,我看到人们说,我相信我见过不止一次 然后在编写问题之前进行搜索,结果显示GUID不应用于任何与安全性相关的内容。所以我的问题是,我怎么做一个随机的64位数字作为重置键或登录键?有人建议我这样做,但我听说在使用RNG时,如果两个内核同时这样做,它将具有相同的种子,因此不安全。我应该有一个带有锁(rng){}的静态函数,并使用下面的代码调用它吗?还有别的办法吗?我该怎么做 using (var rng = new System.Security.Cryptography.RNGCryptoS

在过去,我看到人们说,我相信我见过不止一次

然后在编写问题之前进行搜索,结果显示GUID不应用于任何与安全性相关的内容。所以我的问题是,我怎么做一个随机的64位数字作为重置键或登录键?有人建议我这样做,但我听说在使用RNG时,如果两个内核同时这样做,它将具有相同的种子,因此不安全。我应该有一个带有锁(rng){}的静态函数,并使用下面的代码调用它吗?还有别的办法吗?我该怎么做

using (var rng = new System.Security.Cryptography.RNGCryptoServiceProvider())
{
    byte[] inBytes = new byte[4];
    rng.GetBytes(inBytes);
    return BitConverter.ToInt64(inBytes,0);
}

安全的钥匙不一定在钥匙里。如果生成一个长度足够长的随机密钥,并将该密钥存储在数据库中并带有过期日期,那么您的解决方案应该足够安全。仅仅生成一个安全的散列对我来说是不够安全的,但是如果密钥必须在我的数据库中,那么当我得到一个时,我就有信心了

为什么要设定有效期?不一定是为了增加安全性,只是因为它们通常用于即时使用。如果用户在一天内没有使用密码重置密钥,我想让它过期,让他们要求另一个密码重置密钥。重置消息去了某个地方,如果它在网络空间中漫游(可能在其他人的邮箱中),最好限制它的生命周期

我所说的“信心”是什么意思?简单地说就是:很有可能钥匙是我生成的。如果密钥是内部一致的(安全散列),那么如果有人偶然发现了我生成密钥的方法,那么他们可以生成一个伪密钥。当然,如果我使用私钥生成散列,他们需要找到我的私钥。但如果他们这样做了,那么我的数据库就会暴露

另一方面,如果我生成一个大的随机密钥并将其存储在我的数据库中,那么破坏系统的唯一方法就是猜测数据库中的密钥。如果我使它们过期,并在使用它们后使它们失效,那么一个足够大的密钥就不太可能实现这一点。如果您添加了一些错误猜测安全性,比如在一些错误猜测之后重定向到后门页面,那么您将使某人很难猜测重置或后门钥匙。有了这一点,我“相信”成功的后门尝试是由我授权的,并且我可以在我的应用程序中使用该算法


我们在大型支付流程应用程序中执行此操作。我们和我们的客户对提供的安全性非常满意。

ha,我认为rand om key是指随机的O.M.钥匙。现在我意识到你只是增加了一个空间。好的,那么1)为什么要设定有效期?2) “那么当我拿回来一个的时候我就能有信心”是什么意思?哎呀。很抱歉。我扩大了我的答案。回答得好。一旦成功,我就宣布它们无效。“大”有多大?这是1024位吗?较高的?我使用64位。就像我说的,我怀疑任何人都猜不到,即使他们知道我使用的是哪个RNG,并且知道密钥重置/登录的时间。这是100%的“足够好”,但我问,因为我想知道它什么时候算。我对RNGCryptoServiceProvider random()了解不多,我仍然认为使用GUID的前半部分和后半部分作为64位数字是安全的。但是无论如何+1是对你的技巧的很好的回答和解释。这个键确实在数据库中,prv/pub的思想非常疯狂,我们使用整个GUID。由于我们将它们作为用户可以点击的链接发送到电子邮件中,因此它们的长度并不是一个大问题。