-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");
}  

弱いパスワードや短いパスワードについてユーザーに警告するのは良いことですが、決して必須にするべきではないことに注意してください。あまりにも多くのパスワードを除外することで、攻撃者はそれをスキップできるため、実際にはブルートフォース攻撃を容易にします。また、パスワードを覚えるのが難しすぎると、ユーザーがパスワードを書き留めてモニターにポストすることを余儀なくされるため、安全ではありません。もう1つのことは、スペース、タブ、"またはなど、すべての文字を適切に処理できることを確認することです/。ユーザーが望むなら" 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数字にすることはできないため、trueになることはありません。パスワードに少なくとも1つの大文字、1つの小文字、および数字が含まれているかどうかを確認するループが必要になる場合があります。それを行う方法については、sの回答を参照してください(私がこれを入力しているときに彼が投稿しました、ありがとう;-))。Agent_L

于 2013-01-11T11:49:35.220 に答える