Pergunta

I have the following method as part of a password generating program to generate a random password which is then validated.

My problem is that the srand function never meets the validation requirements and keeps looping back to create a new password.

Im posting the code below to ask if anyone has a more efficient way to create the random password so that it will meet validation requirements instead of looping back continously.Thanks.

static bool verifyThat(bool condition, const char* error) {
    if(!condition) printf("%s", error);
    return !condition;
}




//method to generate a random password for user following password guidelines.  
void generatePass()

{
    FILE *fptr;//file pointer
    int iChar,iUpper,iLower,iSymbol,iNumber,iTotal;


    printf("\n\n\t\tGenerate Password selected ");

    get_user_password:
    printf("\n\n\t\tPassword creation in progress... ");

    int i,iResult,iCount;
    char password[10 + 1];
    char strLower[59+1] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRTUVWXYZ!£$%^&*";


    srand(time (0));

    for(i = 0; i < 10;i++)
    {
        password[i] = strLower[(rand() % 52)];

    }
    password[i] = '\0';


    iChar = countLetters(password,&iUpper,&iLower,&iSymbol,&iNumber,&iTotal);

    //folowing statements used to validate password
    iChar = countLetters(password,&iUpper,&iLower,&iSymbol,&iNumber,&iTotal);
    iUpper = countLetters(password,&iUpper,&iLower,&iSymbol,&iNumber,&iTotal);
    iLower =countLetters(password,&iUpper,&iLower,&iSymbol,&iNumber,&iTotal);
    iSymbol =countLetters(password,&iUpper,&iLower,&iSymbol,&iNumber,&iTotal);
    iNumber = countLetters(password,&iUpper,&iLower,&iSymbol,&iNumber,&iTotal);
    iTotal = countLetters(password,&iUpper,&iLower,&iSymbol,&iNumber,&iTotal);



    if(verifyThat(iUpper >= 2, "Not enough uppercase letters!!!\n")
     || verifyThat(iLower >= 2, "Not enough lowercase letters!!!\n")
     || verifyThat(iSymbol >= 1, "Not enough symbols!!!\n")
     || verifyThat(iNumber >= 2, "Not enough numbers!!!\n")
     || verifyThat(iTotal >= 9, "Not enough characters!!!\n")
     || verifyThat(iTotal <= 15, "Too many characters!!!\n"))

    goto get_user_password;

    iResult = checkWordInFile("dictionary.txt", password);

    if(verifyThat(iResult != gC_FOUND, "Password contains small common 3 letter word/s."))
    goto get_user_password;

    iResult = checkWordInFile("passHistory.txt",password);

    if(verifyThat(iResult != gC_FOUND, "Password contains previously used password."))
    goto get_user_password;


    printf("\n\n\n Your new password is verified ");
    printf(password);

    //writing password to passHistroy file.


    fptr = fopen("passHistory.txt", "w");   // create or open the file
    for( iCount = 0; iCount < 8; iCount++)
    {
        fprintf(fptr, "%s\n", password[iCount]);
    }

    fclose(fptr);


    printf("\n\n\n");
    system("pause");



}//end of generatePass method.
Foi útil?

Solução

I looked at your code at glance and I think I have found the reasons inspite of which validation requirements aren`t meet.

I suggest you to pay attention to the following parts of your code:
1) char strLower[59+1] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRTUVWXYZ!£$%^&*";

here you should add numbers 0..9, this is one of the reasons why requirements could not be met, because how number can be picked if it isn`t in the set of numbers from which you pick?!
replace it for ex. with:

char strLower[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRTUVWXYZ!£$%^&*0123456789";

2) password[i] = strLower[(rand() % 52)]; - and in this part of the code, replace 52 with total number of symbols in string from which you randomly pick numbers.
I recommend you to replace it with the following code:

password[i] = strLower[(rand() % (sizeof(strLower) / sizeof(char) - 1))];

Outras dicas

you could alter your algorithm.

  • choose at random a number of Upper characeters that is above 2.
  • choose at random a number of Lower character that is above 2.
  • choose at random a number of Sybmol character that is above 1.
  • choose at random a number of Number characters that is above 2.

and then recompose your password with the random items, re-ordered at random. Fill with whatever character you want to pas the verifyThat predicates: >=9 and <= 15.

And please: don't use goto. Make function calls instead.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top