【问题标题】:How to generate random password?如何生成随机密码?
【发布时间】:2018-11-01 02:50:25
【问题描述】:

我需要生成一个随机密码,该密码将在 OpenPGP.js 中用于对称加密某些内容。用户永远不必触摸或查看密码(一切都在幕后发生)。 因此,理想情况下,密码只是一些随机字节。不幸的是,OpenPGP.js 不支持(据我所知)。它只支持字符串作为密码。

所以我需要生成一个随机密码字符串。我希望它尽可能随机;排除尽可能少的字符。

如何生成安全的随机密码字符串?

我目前有这个:

String.fromCharCode.apply(null, crypto.getRandomValues(new Uint8Array(32)));

但是,我有点担心,当某些随机字节出现时,它可能会弄乱 UTF-16 代理对,并且根据 Unicode 实现,密码在其他浏览器上的解释可能会有所不同。

此解决方案跨浏览器使用是否安全?

【问题讨论】:

    标签: javascript passwords openpgp.js


    【解决方案1】:

    我会很容易地使用类似的东西:

    function generatePass() {
      var pass = "";
      var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    
      var passLength = (Math.random() * 15) + 5;
      
      for (var i = 0; i < passLength; i++)
        pass += possible.charAt(Math.floor(Math.random() * possible.length));
    
      return pass;
    }
    
    console.log(generatePass());

    Das anpassen und variieren des Codes ist auch sehr leicht und läuft überall。

    【讨论】:

    • Danke, aber nicht was ich suche :)
    【解决方案2】:

    在这里查看Fiddle

    function CreateRandomPassword(Length, isUpperAlpha, isLowerAlpha, isNumaric ,SpecialChars)
    {
      var _allowedChars = "";
      if (isUpperAlpha != false)
        _allowedChars += "ABCDEFGHJKLMNOPQRSTUVWXYZ";
      if (isLowerAlpha != false)
        _allowedChars += "abcdefghijkmnopqrstuvwxyz";
      if (isNumaric != false)
        _allowedChars += "0123456789";
      _allowedChars += SpecialChars;
      if(!Length)
        Length = 8
      var chars = "";
      allowedCharCount = _allowedChars.length;
      if(allowedCharCount == 0)
        return " ";
      for (var i = 0; i < Length; i++)
      {
        chars += _allowedChars[Math.floor(Math.random() * Math.floor(allowedCharCount))];
      }
      return chars;
    }
    

    我开发了生成密码的简单功能

    【讨论】:

    • 您也应该在此处提供CreateRandomPassword() 函数的代码,而不是链接到外部站点。该链接可能有一天会断开,使您的答案无用。
    • 这里有
    【解决方案3】:

    回答我自己的问题:

    我系统的一部分加密和解密密码(例如问题中的随机密码)。 在使用 OpenPGP.js 测试我的解决方案时,从解密操作(加密后)返回的字符串随机不完全等于原始字符串(可能是十分之一)。

    这表明 OpenPGP.js 在输入不正确时不会正确序列化或反序列化 UTF-8(或它使用的任何编码)。我猜我正在生成的字符串是无效的 Unicode——至少在 Chrome 中是这样。

    显然,当我定义一个有限的已知字符集时,我会工作。

    总结一下:

    String.fromCharCode.apply(null, crypto.getRandomValues(new Uint8Array(32)));
    

    使用起来不安全。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-08
      • 2010-12-22
      • 2012-11-06
      • 2015-04-13
      • 2012-07-28
      • 2011-09-05
      相关资源
      最近更新 更多