繁体   English   中英

利用Math.random()生成密码重置密钥可以吗?

[英]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)生成密码。 这里可以找到从安全随机数生成器中检索密码的同样公正的实现。


如果您无权使用随机数生成器,则:

  1. 从服务器获取安全随机数;
  2. 从客户端添加随机熵(鼠标移动,系统时间,一些不安全的随机值等),并将其与服务器的随机熵连接;
  3. 对结果数组执行安全计算,例如哈希或PRNG实现,以创建随机数;
  4. 使用(3)创建密码。

您绝对应该仅在安全连接上执行此操作,并牢记网络钓鱼攻击。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM