2016-07-06 8 views
2

저는 파이썬을 사용하여 소문자와 대문자 및 숫자를 포함하여 비밀번호를 생성하고 싶습니다.하지만이 3 가지 종류가 모두 사용되었음을 보증해야합니다. 지금까지이 글을 썼지 만 3 가지 종류의 글자가 모두 사용되는 것은 아닙니다. 8 부분을 2 부분으로 나누고 싶습니다. 처음 3, 마지막 5. 다음 전나무 부분에있는 모든 3 가지 종류의 문자가 다음 부분과 함께 셔플을 사용하고 있는지 확인하십시오. 그러나 코드하는 법을 모릅니다.파이썬을 사용하여 8 문자 비밀번호를 생성하고 파이썬을 사용하여 숫자를

import random 
a = 0 
password = '' 
while a < 8: 
    if random.randint(0, 61) < 10: 
     password += chr(random.randint(48, 57)) 
    elif 10<random.randint(0, 61)<36: 
     password += chr(random.randint(65, 90)) 
    else: 
     password += chr(random.randint(97, 122)) 
    a += 1 
print(password) 

답변

0

귀하의 질문은 세 부분으로 구성 : - 처음 3과 마지막 5 -

  1. 분열 8 문자 2 부분 (문자열 슬라이싱)
  2. 은 첫 번째 부분에 있는지 확인 모든 삼가지 문자의 (검증 암호)
  3. 는 문자 (셔플 문자열) 셔플

를 사용하고 있습니다

1 부 : 당신은 당신의 코드 끝에이를 삽입하면 슬라이스 문자열 여기

좋은 튜토리얼 ..., 귀하의 경우에는

.. 어떻게 slice strings using python에 가르치고

print(password[:3]) 
print(password[3:]) 

... 처음 3 자와 마지막 5자를 볼 수 있습니다.


2 부 : 암호 확인

좋은 대답은 here입니다.

def password_check(password): 
    # calculating the length 
    length_error = len(password) < 8 

    # searching for digits 
    digit_error = re.search(r"\d", password) is None 

    # searching for uppercase 
    uppercase_error = re.search(r"[A-Z]", password) is None 

    # searching for lowercase 
    lowercase_error = re.search(r"[a-z]", password) is None 

    # overall result 
    password_ok = not (length_error or digit_error or uppercase_error or lowercase_error) 

    return password_ok 

password_check(password) 

이 기능은 True 만족하는 경우 모든 조건, False하지 않을 경우를 반환합니다.


파트 3 : 셔플 문자열

if password_check(password) == True: 
    new_pwd = ''.join(random.sample(password,len(password))) 
    print new_pwd 

이 코드는 전체 비밀번호를 섞고 new_pwd


PS라는 새로운 변수에 할당합니다. 전체 코드는 here입니다!

3

앞에서 말한 것처럼 처음 세 자리는 각각 대문자와 숫자에서 무작위로 선택하고 나머지는 무작위로 모두자를 선택한 다음 임의로 선택합니다.

from random import choice, shuffle 
from string import ascii_uppercase, ascii_lowercase, digits 
pwd = [choice(ascii_lowercase), choice(ascii_uppercase), choice(digits)] \ 
     + [choice(ascii_lowercase + ascii_uppercase + digits) for _ in range(5)] 
shuffle(pwd) 
pwd = ''.join(pwd) 

주 이런 식으로 숫자가 될 수있는 비트가 사용 가능한 모든 문자의 대부분에서 무작위로 선택 될 때, '취약 계층', 그래서 62분의 10의 기회가 있다는이 모든 문자 후 처음 세 자리는 숫자입니다. 문자의 1/3을 숫자로 쓰려면 (아래 참조) 좋은 아이디어가 아닐 수도 있습니다. 먼저 각각 1/3의 확률로 하나의 문자 그룹을 선택하고 다음 그룹을 나타내는 문자 양식을 임의로 선택할 수 있습니다 :

pwd = [choice(ascii_lowercase), choice(ascii_uppercase), choice(digits)] \ 
     + [choice(choice([ascii_lowercase, ascii_uppercase, digits])) for _ in range(5)] 

하지만주의가이 것 감소 임의성, 따라서 암호의 보안 -하지만 이렇게 세 그룹의 각 중 하나 이상을 가지고있는 요구 사항을 수행합니다.

+0

나는 편집하기 전에 더 좋았을 것이라고 생각한다 ... 보안 관점에서 문자의 상대 확률을 바꾸는 것이 좋지 않다. – glibdud

+0

@glibdud 동의 함. 통지를 추가했습니다. –

+0

나는 여전히 그 부분의 가치를 보지 못했지만 ... 상반기는 완전히 그 문제를 다룹니다. (어느 쪽의 방법이라도) – glibdud

0

정규 표현식을 사용하여 정규 표현식과 일치하는 문자가 있는지 확인할 수 있습니다.

import re 
string = "AaBbCc12" 

if re.search('[a-z]',string)\ 
and re.search('[0-9]',string)\ 
and re.search('[A-Z]',string): 
    print("This is a string you are looking for") 
else: 
    print("Nope") 

이것은 다소 세련되지 않은 해결책이지만 이해력과 적응력면에서 가장 빠릅니다.

관련 문제