我想在 Javascript 中在客户端的网页中生成密码。密码应该使用字母和数字,也许是一些符号。如何安全地在 Javascript 中生成密码?
问问题
3293 次
2 回答
10
由于密码需要不可预测,因此需要由种子良好的加密 PRNG 生成。Math.random
通常是不安全的。
现代浏览器(至少是当前版本的 Firefox 和 Chrome)支持window.crypto.getRandomValues
生成安全随机值。
基于 Presto 的 Opera 不支持它,但它Math.random
是安全的。但是既然 Opera 已经死了,那么回退应该不再是必要的了。
function randomString(length)
{
var charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
var i;
var result = "";
var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
if(window.crypto && window.crypto.getRandomValues)
{
values = new Uint32Array(length);
window.crypto.getRandomValues(values);
for(i=0; i<length; i++)
{
result += charset[values[i] % charset.length];
}
return result;
}
else if(isOpera)//Opera's Math.random is secure, see http://lists.w3.org/Archives/Public/public-webcrypto/2013Jan/0063.html
{
for(i=0; i<length; i++)
{
result += charset[Math.floor(Math.random()*charset.length)];
}
return result;
}
else throw new Error("Your browser sucks and can't generate secure random numbers");
}
alert(randomString(10))
于 2013-08-08T08:48:06.897 回答
-1
var random=Math.random().toString(36).substring(7);//this gives you 7 alpha numeric characters.
var timestamp =new Date().getTime();//this gives you epoch time
var my_very_unique_password=(random+timestamp);//concat both..
alert(my_very_unique_password);
如果你不想要这么大的密码,就做alert(random)
于 2013-08-08T05:58:45.653 回答