在项目中有这样一个需求:需要生成一组随机密码,确保安全性。因此,我去翻了一个项目 的代码。这里是具体的代码
function GeneratePassword ( ) {
if (parseInt (navigator.appVersion) <= 3 ) {
alert("Sorry this only works in 4.0+ browsers" );
return true ;
}
var length=8 ;
var sPassword = "" ;
length = document .aForm.charLen.options[document .aForm.charLen.selectedIndex].value;
var noPunction = (document .aForm.punc.checked);
var randomLength = (document .aForm.rLen.checked);
if (randomLength) {
length = Math .random();
length = parseInt (length * 100 );
length = (length % 7 ) + 6
}
for (i=0 ; i < length; i++) {
numI = getRandomNum();
if (noPunction) { while (checkPunc(numI)) { numI = getRandomNum(); } }
sPassword = sPassword + String .fromCharCode(numI);
}
document .aForm.passField.value = sPassword
return true ;
}
function getRandomNum ( ) {
var rndNum = Math .random()
rndNum = parseInt (rndNum * 1000 );
rndNum = (rndNum % 94 ) + 33 ;
return rndNum;
}
function checkPunc (num ) {
if ((num >=33 ) && (num <=47 )) { return true ; }
if ((num >=58 ) && (num <=64 )) { return true ; }
if ((num >=91 ) && (num <=96 )) { return true ; }
if ((num >=123 ) && (num <=126 )) { return true ; }
return false ;
}
Code language: JavaScript ( javascript ) 上完代码,接下来来分析一下这段代码
首先,这段代码中有三个函数,其关系如下图所示
密码生成器各函数关系图 其中 getRandomNum 生成了一个范围在 33 – 127 的数字。这里是由于在后续生成随机字符串时,用的是 String.fromCharCode ,当数字在 33~127 之间时,能够确保生成的数字在输入时比较简单。
String.fromCharCode 的测试结果 而 checkPunc 则是检测输出的文字是否可以直接发音,这涉及到记忆的难度的问题,在一个长的字符串中,记忆 ABCD 肯定比记忆逗号、破折号、句号等符号要简单一些,毕竟字母肯定要好记忆点,可以自编语句来实现。
接下来我们来看最核心的 GeneratorPassword 函数:如果将其中的 Dom 操作都忽略掉,并设置一个值。并进行配置后,代码如下:
function GeneratePassword ( ) {
if (parseInt (navigator.appVersion) <= 3 ) {
alert("Sorry this only works in 4.0+ browsers" );
return true ;
}
var length=8 ;
var sPassword = "" ;
length = 10
var noPunction = false
var randomLength = false
if (randomLength) {
length = Math .random();
length = parseInt (length * 100 );
length = (length % 7 ) + 6
}
for (i=0 ; i < length; i++) {
numI = getRandomNum();
if (noPunction) { while (checkPunc(numI)) { numI = getRandomNum(); } }
sPassword = sPassword + String .fromCharCode(numI);
}
return true ;
}
Code language: JavaScript ( javascript ) 其代码逻辑图如下
密码生成器的代码逻辑图