[英]Is it okay to utilize Math.random() to generate a Password-Reset-Key?
对于一个简单的算法,我有一个非常基本的想法,该算法将允许用户通过请求发送到电子邮件的随机代码来重置密码。
如果用户忘记了其密码,则可以请求服务器生成一个重置代码,并将其作为电子邮件发送给他们。 然后,此代码将附加到他们在数据库中的用户条目。 确认输入表单将要求用户在前端键入重置代码-如果失败,则将标记该代码并使其无效。 如果成功,则将它们发送到新的PW重置表单,在其中他们可以更新其凭据,以通过对后端的PUT
请求来替换它们。
这是我的基本想法-
function generate7KeyPasswordResetConfirmationCode() {
const arrayOfSeven = [1, 2, 3, 4, 5, 6, 7]
const alphabet = [Array of 26 Lowercase Chars and 26 Uppercase Chars]
const letterOrNumber = arrayOfSeven.map(currentPos => {
// return pseudorandom number between 0-100
const oneToOneHundred = Math.floor(Math.random() * Math.floor(101))
if (oneToOneHundred < 50) { return "char" }
else if (oneToOneHundred >= 50) { return "num" }
})
const resetKey = letterOrNumber.map(numOrChar => {
// return pseudorandom number between 0-51 and return a-z-A-Z
if (numOrChar === "char") {
const index = Math.floor(Math.random() * Math.floor(52))
return alphabet[index]
}
// return pseudorandom number 0-9
if(numOrChar === "num") {
return Math.floor(Math.random() * Math.floor(10))
}
})
return resetKey
}
但是,我的方法涉及Math.random(),我在MDN上注意到了这一点:
Math.random() does not provide cryptographically secure random numbers. Do not use them for anything related to security. Use the Web Crypto API instead, and more precisely the window.crypto.getRandomValues() method
我意识到我可以只使用uuid4,但我想创建自己的解决方案-如何才能完全破解? 如果我第一次尝试失败使代码无效,还有什么可能出错?
不,使用非安全随机数生成器永远不是一个好主意。 随机生成的密码应具有与随机生成的密钥相似的属性。 不能保证随机数生成器不会受到其他脚本的影响。 在最坏的情况下,其他脚本可能会找出随机数生成器的状态并直接计算您的密码。
因此,请使用window.crypto.getRandomValues(array)
生成密码。 在这里可以找到从安全随机数生成器中检索密码的同样公正的实现。
如果您无权使用随机数生成器,则:
您绝对应该仅在安全连接上执行此操作,并牢记网络钓鱼攻击。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.