C++
 Computer >> コンピューター >  >> プログラミング >> C++

【C++入門】パスワードの強度(弱・中・強)を判定するプログラムの作り方

パスワードとして入力された文字列を受け取り、そのパスワードがどれほど安全か(推測されにくいか・解読されにくいか)を「弱い」「普通」「強い」の3段階で判定するプログラムを、C++で実装してみましょう。

パスワード強度の判定基準

パスワードの強度を評価するには、以下の条件を満たしているかどうかを確認します。

  • パスワードは8文字以上であること
  • 小文字のアルファベットを1文字以上含むこと
  • 大文字のアルファベットを1文字以上含むこと
  • 数字を1つ以上含むこと
  • 特殊記号(! @ # $ % ^ & * ( ) > < , . + = - など)を1つ以上含むこと

たとえば「tutorialspoint」というパスワードは、小文字のアルファベットだけで構成されており簡単に推測できるため、「弱い(Weak)」と判定されます。一方「Tutorialspoint@863!」は大文字・小文字・数字・特殊記号をすべて含み、8文字を超える長さもあるため、強力なパスワードの条件をすべて満たした「強い(Strong)」なパスワードです。

また、強力なパスワードの条件の半分以上を満たしている場合は「普通(Moderate)」と判断します。たとえば「tutorialspoint12」は、小文字と数字を含み、長さも8文字以上あるため、中程度の強度と評価されます。

実行例

入力:tutoriAlspOint!@12
出力:Strength of password:-Strong
説明:小文字・大文字・特殊記号・数字をそれぞれ1つ以上含み、8文字より長いため、このパスワードは「強い」と判定されます。

入力:tutorialspoint
出力:Strength of password:-Weak

解決のためのアプローチ

  • パスワードの文字列を入力として受け取る。
  • パスワード強度を左右する各要素(文字種・長さなど)をすべてチェックする。
  • チェック結果に応じて、パスワードの強度を出力する。

アルゴリズム

開始
    ステップ1 ⇒ 関数 void printStrongNess(string& input) 内で:
        n = input.length() を宣言・初期化
        bool hasLower = false, hasUpper = false を宣言
        bool hasDigit = false, specialChar = false を宣言
        string normalChars = "abcdefghijklmnopqrstu"
        "vwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 " を宣言
        ループ For i = 0 ~ i < n、i++ ずつ増加:
            islower(input[i]) ならば hasLower = true を設定
            isupper(input[i]) ならば hasUpper = true を設定
            isdigit(input[i]) ならば hasDigit = true を設定
            size_t special = input.find_first_not_of(normalChars) を設定
            special != string::npos ならば specialChar = true を設定
        ループ終了
        "Strength of password:-" を出力
        hasLower && hasUpper && hasDigit &&
           specialChar && (n >= 8) ならば
            "Strong" を出力
        それ以外で (hasLower || hasUpper) &&
            specialChar && (n >= 6) ならば
            "Moderate" を出力
        それ以外は
            "Weak" を出力
    ステップ2 ⇒ 関数 int main() 内で:
        input = "tutorialspoint!@12" を宣言・初期化
        printStrongNess(input) を呼び出す
終了

C++での実装コード

#include <iostream>
using namespace std;
void printStrongNess(string& input) {
    int n = input.length();
    // 文字列内に小文字アルファベットが含まれるかチェック
    bool hasLower = false, hasUpper = false;
    bool hasDigit = false, specialChar = false;
    string normalChars = "abcdefghijklmnopqrstu" "vwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 ";
    for (int i = 0; i < n; i++) {
       if (islower(input[i]))
          hasLower = true;
       if (isupper(input[i]))
          hasUpper = true;
       if (isdigit(input[i]))
          hasDigit = true;
       size_t special = input.find_first_not_of(normalChars);
       if (special != string::npos)
          specialChar = true;
    }
    // パスワードの強度を判定して出力
    cout << "Strength of password:-";
    if (hasLower && hasUpper && hasDigit &&
       specialChar && (n >= 8))
       cout << "Strong" << endl;
    else if ((hasLower || hasUpper) &&
       specialChar && (n >= 6))
       cout << "Moderate" << endl;
    else
       cout << "Weak" << endl;
}
int main() {
    string input = "tutorialspoint!@12";
    printStrongNess(input);
    return 0;
}

出力結果

Strength of password:-Moderate

このように、islower・isupper・isdigitといった標準ライブラリ関数とfind_first_not_ofを組み合わせることで、パスワードに含まれる文字種を効率的に判別できます。条件分岐によって「Strong」「Moderate」「Weak」の3段階で強度を出力するシンプルな構成なので、実際のWebサービスやアプリケーションのパスワード強度チェック機能の基礎としても応用しやすい実装です。

  1. C++でべき等行列を判定するプログラムの作成方法

    行数を r、列数を c とする行列 M[r][c] が与えられ、r = c となる正方行列を考えます。この記事では、与えられた正方行列がべき等行列(アイデンポテント行列)であるかどうかを判定するC++プログラムを解説します。 べき等行列とは 行列 M がべき等行列であるとは、行列 M と自分自身の積が元の行列 M と等しくなること、すなわち M × M = M が成り立つことを指します。 例えば、次の行列を見てください。 この行列を自分自身で掛け合わせても、結果は元の行列とまったく同じになります。したがって、この行列はべき等行列であると言えます。 べき等行列の代表的な例としては、ベクトルを

  2. C++で対角行列・スカラー行列を判定するプログラムの書き方

    行列 M[r][c] が与えられたとき、「r」は行数、「c」は列数を表し、r = c のとき正方行列となります。本記事では、与えられた正方行列が対角行列であるか、スカラー行列であるかを判定し、該当する場合には「yes」を出力する方法を解説します。 対角行列とは 正方行列 m[][] が対角行列であるのは、主対角線以外の要素がすべてゼロである場合、かつその場合に限ります。 下図のように、赤色で示された要素が主対角成分(非ゼロ)であり、それ以外の要素はすべてゼロになっているため、この行列は対角行列です。 入出力例 Input: m[3][3] = { {7, 0, 0}, {0, 8, 0}