Python 에서 실 현 된 암호 강도 검출 기 예시
암호 강도
암호 강 도 는 어떻게 계량 화 됩 니까?
하나의 비밀 번 호 는 다음 과 같은 몇 가지 유형 이 있 을 수 있다.길이,대문자,소문 자,숫자 와 특수 기호 이다.
암호 에 포 함 된 특징 이 많 을 수록 길이 가 길 수록 강도 가 높 은 것 은 분명 하 다.
우 리 는 몇 개의 등급 을 설정 하여 암호 의 강 도 를 평가 합 니 다.각각 terrible,simple 입 니 다.
medium, strong。
서로 다른 응용 프로그램 은 암호 강도 에 대한 요구 가 다 를 수 있 습 니 다.우 리 는 최소(min)를 도입 합 니 다.length)와 최소 특징 수(mintypes)설정 가능 한 옵션 으로 사용 합 니 다.
이렇게 하면 우 리 는 암호 에 포 함 된 특징 을 검사 할 수 있 고 특징 과 암호 간 의 관 계 는 간단하게 정의 할 수 있다.
특징 수
강도.
최소 길이 이하
terrible
비밀번호
simple
최소 특징 수 이하
medium
최소 특징 수 보다 크 거나 같 음
strong
다른:자주 사용 하 는 1 만 개의 비밀 번 호 를 누 르 십시오본 사이트 다운로드.
코드 구현
check.py
# coding: utf-8
"""
check
Check if your password safe
"""
import re
#
NUMBER = re.compile(r'[0-9]')
LOWER_CASE = re.compile(r'[a-z]')
UPPER_CASE = re.compile(r'[A-Z]')
OTHERS = re.compile(r'[^0-9A-Za-z]')
def load_common_password():
words = []
with open("10k_most_common.txt", "r") as f:
for word in f:
words.append(word.strip())
return words
COMMON_WORDS = load_common_password()
#
class Strength(object):
"""
: valid, strength, message
"""
def __init__(self, valid, strength, message):
self.valid = valid
self.strength = strength
self.message = message
def __repr__(self):
return self.strength
def __str__(self):
return self.message
def __bool__(self):
return self.valid
class Password(object):
TERRIBLE = 0
SIMPLE = 1
MEDIUM = 2
STRONG = 3
@staticmethod
def is_regular(input):
regular = ''.join(['qwertyuiop', 'asdfghjkl', 'zxcvbnm'])
return input in regular or input[::-1] in regular
@staticmethod
def is_by_step(input):
delta = ord(input[1]) - ord(input[0])
for i in range(2, len(input)):
if ord(input[i]) - ord(input[i - 1]) != delta:
return False
return True
@staticmethod
def is_common(input):
return input in COMMON_WORDS
def __call__(self, input, min_length=6, min_type=3, level=STRONG):
if len(input) < min_length:
return Strength(False, "terrible", " ")
if self.is_regular(input) or self.is_by_step(input):
return Strength(False, "simple", " ")
if self.is_common(input):
return Strength(False, "simple", " ")
types = 0
if NUMBER.search(input):
types += 1
if LOWER_CASE.search(input):
types += 1
if UPPER_CASE.search(input):
types += 1
if OTHERS.search(input):
types += 1
if types < 2:
return Strength(level <= self.SIMPLE, "simple", " ")
if types < min_type:
return Strength(level <= self.MEDIUM, "medium", " ")
return Strength(True, "strong", " ")
class Email(object):
def __init__(self, email):
self.email = email
def is_valid_email(self):
if re.match("^.+@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", self.email):
return True
return False
def get_email_type(self):
types = ['qq', '163', 'gmail', '126', 'sina']
email_type = re.search('@\w+', self.email).group()[1:]
if email_type in types:
return email_type
return 'wrong email'
password = Password()
test_check.py:유닛 테스트 에 사용
# coding: utf-8
"""
test for check
"""
import unittest
import check
class TestCheck(unittest.TestCase):
def test_regular(self):
rv = check.password("qwerty")
self.assertTrue(repr(rv) == "simple")
self.assertTrue(' ' in rv.message)
def test_by_step(self):
rv = check.password("abcdefg")
self.assertTrue(repr(rv) == "simple")
self.assertTrue(' ' in rv.message)
def test_common(self):
rv = check.password("password")
self.assertTrue(repr(rv) == "simple")
self.assertTrue(' ' in rv.message)
def test_medium(self):
rv = check.password("ahj01a")
self.assertTrue(repr(rv) == 'medium')
self.assertTrue(' ' in rv.message)
def test_strong(self):
rv = check.password("asjka9AD")
self.assertTrue(repr(rv) == 'strong')
self.assertTrue(' ' in rv.message)
#
def test_email(self):
rv = check.Email("[email protected]")
self.assertEqual(rv.is_valid_email(), True)
def test_email_type(self):
rv = check.Email("[email protected]")
types = ['qq', '163', 'gmail', '126', 'sina']
self.assertIn(rv.get_email_type(), types)
if __name__ == '__main__':
unittest.main()
PS:여기 서 여러분 께 참고 하여 사용 할 수 있 도록 관련 온라인 도 구 를 두 가지 더 제공 합 니 다.온라인 무 작위 숫자/문자열 생 성 도구:
http://tools.jb51.net/aideddesign/suijishu
고강도 암호 생 성기:
http://tools.jb51.net/password/CreateStrongPassword
더 많은 파 이 썬 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 Python 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.