Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 비밀번호 강도 검사 프로그램 구현하기

비밀번호 문자열이 입력으로 주어졌을 때, 해당 비밀번호의 강도를 검사하는 것이 이번 글의 목표입니다.

비밀번호 강도란?

비밀번호의 강도란 그 비밀번호가 얼마나 쉽게 추측되거나 크랙(hack)될 수 있는지를 나타내는 척도입니다. 비밀번호의 강도는 약함(Weak), 보통(Moderate), 강함(Strong) 세 단계로 나눌 수 있습니다.

비밀번호가 강력한지 판단하려면 다음 조건들을 확인해야 합니다.

  • 비밀번호는 최소 8자 이상이어야 합니다.
  • 소문자 알파벳을 최소 1개 포함해야 합니다.
  • 대문자 알파벳을 최소 1개 포함해야 합니다.
  • 숫자를 최소 1개 포함해야 합니다.
  • 특수문자(예: !@#$%^&*()><,.+=-)를 최소 1개 포함해야 합니다.

예를 들어 "tutorialspoint"라는 비밀번호는 소문자만으로 구성되어 있어 누구나 쉽게 추측할 수 있으므로 약함으로 분류됩니다. 반면 "Tutorialspoint@863!"은 대소문자와 숫자, 특수문자를 모두 포함하고 길이도 8자를 넘기 때문에 모든 조건을 충족하는 강함 등급의 비밀번호입니다.

만약 비밀번호가 강력한 비밀번호 조건 중 절반 이상을 충족한다면 보통 등급으로 분류합니다. 예를 들어 "tutorialspoint12"는 소문자와 숫자를 포함하고 길이가 8자를 넘으므로 보통 등급에 해당합니다.

예제

입력: tutoriAlspOint!@12
출력: Strength of password:-Strong
설명: 비밀번호에 소문자 1개, 대문자 1개, 특수문자 1개, 숫자가 포함되어 있고 길이가 8자를 초과하므로 강함(Strong)입니다.

입력: tutorialspoint
출력: Strength of password:-Weak

해결 접근 방식

  • 비밀번호 문자열을 입력받습니다.
  • 비밀번호 강도를 판단하는 각 요소(길이, 대소문자, 숫자, 특수문자)를 검사합니다.
  • 검사 결과에 따라 비밀번호의 강도를 출력합니다.

알고리즘

Start
    Step 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++
            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 설정
        반복문 종료
        "Strength of password:-" 출력
        If (hasLower && hasUpper && hasDigit &&
            specialChar && (n >= 8))
            "Strong" 출력
        else if ((hasLower || hasUpper) &&
            specialChar && (n >= 6))
            "Moderate" 출력
        else
            "Weak" 출력
    Step 2 ⇒ 함수 int main()
        input = "tutorialspoint!@12" 선언 및 초기화
        printStrongNess(input) 호출
Stop

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() 함수를 활용해 일반 문자(영숫자) 외의 특수문자가 존재하는지 검사합니다.

모든 조건(대소문자, 숫자, 특수문자 포함, 8자 이상)을 충족하면 Strong, 일부 조건(영문자와 특수문자 포함, 6자 이상)만 충족하면 Moderate, 그 외의 경우에는 Weak로 분류하여 출력합니다.

예제의 입력값 "tutorialspoint!@12"는 소문자와 특수문자, 숫자를 포함하고 길이가 8자 이상이지만 대문자가 없어 모든 조건을 충족하지 못하므로 Moderate(보통)으로 판정됩니다.