비밀번호 문자열이 입력으로 주어졌을 때, 해당 비밀번호의 강도를 검사하는 것이 이번 글의 목표입니다.
비밀번호 강도란?
비밀번호의 강도란 그 비밀번호가 얼마나 쉽게 추측되거나 크랙(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) 호출
StopC++ 구현 코드
#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(보통)으로 판정됩니다.