2014-07-25 64 views
4

我有一個如下的函數,它創建一個強密碼,但它並不總是添加一個特殊字符和一個數字或大寫字母給它,我如何確保它始終具有這些包含在它的要求。使用javascript創建強密碼

密碼要求很長,它已經

8個或更多字符,並且必須有一個特殊的字符, 大寫字母,其中包括一個編號。

我已經把現在顯示以下功能

function GenPwd(nMinimumLength,bIsRequired,sNameoftheButton){ 
      var end=0; 
      var index=0; 
      var sPassCharactersWithoutSpeacil="!#[email protected]*123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ"; 
      var sSpecialCharacters="!#[email protected]*"; 
      var nSrngLen=sStrgStrAddOnChrs 
      var sNumbers="123456789"; 
      var nMinimunLen=Math.round(nBaseLen/2); 
      var PassWordDLength=Math.round((Math.random()*nMinLen)+nMinimumLength+nMinimumLength); //Make sure it is atleadt 8 characters long 
      var Password=""; 
      var PasswordTemporary=""; 
      for(index = 1; index <= PassWordDLength; index++) { 

       nCharacter = Math.round(Math.random()*65); 

       PasswordTemporary = sPassCharactersWithoutSpeacil.charAt(nCharacter); 

       while (PWD.indexOf(PasswordTemporary) > -1) { 
        nCharacter = ''; 
        nCharacter = Math.round(Math.random()*65); 
        PasswordTemporary = sPassCharactersWithoutSpeacil.charAt(nChar); 
       } 
       FinalPWD = Password + PasswordTemporary; 
      } 

這是我必須使用

function GenPwd(nBaseLen,bIsStrong,sBtnName){ 

     var end=0; 
     var index=0; 
     var sPassStr="!#[email protected]*123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ"; 
     var sStrgStrAddOnChrs="!#[email protected]*"; 
     var nSrngLen=sStrgStrAddOnChrs 
     var sStrgStrAddOnNum="123456789"; 
     var nMinLen=Math.round(nBaseLen/2); 
     var PWDLen=Math.round((Math.random()*nMinLen)+nBaseLen); 
     var PWD=""; 
     var PWDTmp=""; 
     //Generate the password 
     for(index = 1; index <= PWDLen; index++) { 

      nChar = Math.round(Math.random()*65); 

      PWDTmp = sPassStr.charAt(nChar); 

      while (PWD.indexOf(PWDTmp) > -1) { 
       nChar = ''; 
       nChar = Math.round(Math.random()*65); 
       PWDTmp = sPassStr.charAt(nChar); 
      } 
      PWD = PWD + PWDTmp; 
     } 

      document.getElementById("pwd").value=PWD; 
     EnableBtn(sBtnName); 
     return true; 
    } 
+0

爲什麼不創建一個GUID然後追加 – bryanmac

回答

3

您可以創建,以確保您的PWD包含至少一個功能一組特定的字符:

function ensurePwdContains(pwd, regexListOfChars, listOfChars) { 
    if (!regexListOfChars.test(pwd)) { 
     // select random char from listOfChars 
     var newChar = listOfChars.charAt(Math.floor(Math.random() * listOfChars.length)); 

     // insert it into the current pwd in a random location 
     // must do +1 to include the location at the end of the string 
     var pos = Math.floor(Math.random() * (pwd.length + 1)); 
     pwd = pwd.slice(0, pos) + newChar + pwd.slice(pos); 
    } 
    return pwd; 
} 

此函數將測試以查看密碼是否至少包含一個傳入的正則表達式實例。如果不是,將從listOfChars參數中選擇一個隨機字符,然後將其插入隨機位置中的現有密碼。

而且,然後調用這個函數在你的函數結束您的每個兩種情況:

FinalPwd = ensurePwdContains(FinalPwd, /[!#\[email protected]*]/, sSpecialCharacters); 
FinalPwd = ensurePwdContains(FinalPwd, /[A-Z]/, "ABCDEFGHIJKLMNOPQRSTUWXYZ"); 

演示:http://jsfiddle.net/jfriend00/ur9FL/


而且,這裏的清理版本的整體實施。你指的是你的函數中的一些變量,它們或者沒有在你的文章中定義,或者沒有在你的函數中使用,所以我刪除了這些變量(因爲我不知道它們是什麼或它們是如何使用的)。這是一個有點清潔執行:

function generatePwd(minLen) { 
    // create a pwd that is between minLen and ((2 * minLen) + 2) long 
    // don't repeat any characters 
    // require at least one special char and one capital char 
    function rand(max) { 
     return Math.floor(Math.random() * max); 
    } 

    function ensurePwdContains(pwd, regexListOfChars, listOfChars) { 
     if (!regexListOfChars.test(pwd)) { 
      var newChar = listOfChars.charAt(rand(listOfChars.length)); 
      var pos = rand(pwd.length + 1); 
      pwd = pwd.slice(0, pos) + newChar + pwd.slice(pos); 
     } 
     return pwd; 
    } 

    var legalChars = "!#[email protected]*123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ"; 
    var specialChars = "!#[email protected]*"; 
    var specialRegex = /[!#\[email protected]*]/; 
    var caps = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    var capsRegex = /[A-Z]/; 
    var nums = "123456789"; 
    var numRegex = /[1-9]/; 

    // make legalChars into an array of chars (easier to deal with) 
    legalChars = legalChars.split(""); 
    var pwd = "", len = minLen + rand(minLen), index; 

    // ensure len is not too long 
    len = Math.min(legalChars.length, len); 

    // now add chars to the pwd string until it is of the desired length 
    while (pwd.length < len) { 
     index = rand(legalChars.length); 
     pwd += legalChars[index]; 
     // remove the char we just used 
     legalChars.splice(index, 1); 
    } 
    // ensure we have at least one special character and one caps char and one 1-9 
    pwd = ensurePwdContains(pwd, specialRegex, specialChars); 
    pwd = ensurePwdContains(pwd, capsRegex, caps); 
    pwd = ensurePwdContains(pwd, numRegex, nums); 
    return pwd;  
} 

而且,產生一大堆密碼的,所以你可以看到你得到什麼類型變化的工作演示:http://jsfiddle.net/jfriend00/7dReY/


爲了把密碼到位,我建議你做第二個函數,調用第一個函數來生成密碼並將其放入選擇的字段中:

function putPasswordInPlace(pwdId, sBtnName) { 
    var pwd = generatePwd(8); 
    document.getElementById(pwdId).value = pwd; 
    EnableButton(sBtnName); 
} 
+0

我必須使用這三個參數,因爲你可以看到下面,我不知道他們到底在哪裏。沒有在這裏傳遞的參數,它不會在頁面上使用生成密碼的按鈕工作,我很抱歉,但這是一個明確的例子,我不知道我在做什麼,或者我想我可能知道我是什麼做 – user2799983

+0

@ user2799983 - 你的代碼甚至沒有使用你在問題中提供的'bIsRequired'或'bIsStrong'參數,所以我不知道你想要做什麼。如果你想描述,那麼期望的行爲,我相信也可以添加功能。我已經創建了第二個函數(在我的答案的末尾),它取得了密碼字段的id和'sBtnName',並執行了額外的部分。這使密碼生成函數保持通用(所以它可以用於其他用途),並且只有第二個函數特定於您的頁面設計(通常是良好的編碼實踐)。 – jfriend00