如何生成随机密码?

时间:2018-05-22 10:54:36

标签: javascript passwords openpgp.js

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

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

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

我目前有这个:

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

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

这种解决方案在浏览器中使用是否安全?

3 个答案:

答案 0 :(得分: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 leichtundläuftüberall。

答案 1 :(得分:0)

回答我自己的问题:

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

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

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

总结一下:

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

使用起来不安全。

答案 2 :(得分:0)

在这里查看Fiddle

CreateRandomPassword(Length, isUpperAlpha, isLowerAlpha, isNumaric ,SpecialChars)

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