我需要生成一个随机密码,该密码将在OpenPGP.js中用于对称加密。用户永远不必触摸或看到密码(一切都在幕后发生)。 因此,理想情况下,密码只是一些随机字节。不幸的是,OpenPGP.js不支持(据我所知)。它只支持字符串作为密码。
所以我需要生成一个随机密码字符串。我希望它尽可能随机;排除尽可能少的字符。
如何生成安全的随机密码字符串?
我目前有这个:
String.fromCharCode.apply(null, crypto.getRandomValues(new Uint8Array(32)));
但是,我有点担心,当出现某些随机字节时,它可能会破坏UTF-16代理对,并且根据其Unicode实现,密码可能会在其他浏览器上得到不同的解释。
这种解决方案在浏览器中使用是否安全?
答案 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)
我开发了简单的密码生成功能