-3

我试图制作一个算法来检查一个字符串中是否有大写、小写和一个数字,如果有,它应该打印“强密码”,如果不是“弱密码”。但它似乎没有工作。

int main() 
{
    int i = 0;
    char string1[100];

    printf("Please enter password\n");
    gets(string1);

    if(strlen(stirng1) < 6)
    {
        printf("Password is too short\n");
    }
    if(islower(string1[i]) && isupper(string1[i]) && isdigit(string1[i]))
    {
        printf("Strong Password\n");
    }
    else
    { 
        printf("Weak Password\n");
    }   
    return 0;
}
4

2 回答 2

5
bool hasUpper = false;
bool hasLower = false;
bool hasDigit = false;

for(int i =0; i < strlen(string1); ++i)
{

    if( islower(string1[i]) )
        hasLower = true;

    if( isupper(string1[i]) )
        hasUpper = true;

    if( isdigit(string1[i]) )
        hasDigit = true;
}
if(hasLower && hasUpper && hasDigit)
{
    printf("Strong Password\n");
}
else
{ 
    printf("Weak Password\n");
}  

请注意,虽然提醒用户注意弱密码或短密码是件好事,但绝不应将其作为一项要求。通过排除太多密码,您实际上使攻击者更容易暴力破解,因为他可以跳过它。太难记的密码也是不安全的,因为用户将被迫将其写下来并发布到监视器上。另一件事是确保您可以正确处理所有字符,例如空格、制表符"/. 如果用户希望" DROP TABLE 'users';正确处理它是您的工作。

密码强度是用户的责任,因为只有用户知道他是否会在您的系统中保留任何有价值的东西。

于 2013-01-11T11:47:59.133 回答
1

if 语句

if(islower(string1[i]) && isupper(string1[i]) && isdigit(string1[i]))
{
    printf("Strong Password\n");
}

永远不会是真的,因为i是0(仍然来自初始化)并且第一个字符string1不能是小写大写数字。您可能需要一个循环,检查密码中是否至少有一个大写字母、一个小写字母和一个数字。请参阅Agent_L如何执行此操作的答案(他在我输入此内容时发布,谢谢;-))。

于 2013-01-11T11:49:35.220 回答