Запись неверного пароля в текстовый файл - PullRequest
0 голосов
/ 25 марта 2019

Первое программирование !!
Я создал программу проверки паролей, которая сначала проверяет, имеет ли пароль длину от 6 до 14 символов.Если это не так, он просит пользователя повторно ввести пароль.Как только он будет принят, он проверяет надежность пароля и выводит, является ли пароль надежным или слабым.Я пытаюсь выяснить, как записать каждую попытку неверного пароля в текстовый файл.записывает, была ли она меньше min_length или больше max_length с указанием даты и времени, и я абсолютно потерян.

Я искал много сайтов и учебных пособий для возможных решений, но не вижувозможное решение

MIN_PASSWORD_LENGTH = 6
MAX_PASSWORD_LENGTH = 14
password = input("Enter Your Password: ")
password_length = len(password)

while True:
    if password_length < MIN_PASSWORD_LENGTH:
        print("Password Rejected - Password must be between 6 and 14 characters long")
        password = input("Enter your password: ")
   elif password_length > MAX_PASSWORD_LENGTH:
        print("Password Rejected - Password must be between 6 and 14 characters long")
        password = input("Enter your password: ")
    else:
        print("Password Accepted")
        break

special = ['!','@','#','$','%','^','&','*','(',')']
letters_found = 0
digits_found = 0
specials_found = 0
for ch in password:
    if ch.isalpha():
        letters_found = 1
    if ch.isdigit():
        digits_found = 1
    if ch in special:
        specials_found = 1
    if digits_found and letters_found and specials_found:
        break

password_strength = letters_found + digits_found + specials_found
if password_strength >=2:
    message = "Password is Strong!"
else:
    message = ",Password is Weak!"
print("Your Password is",(password_length),"characters long.",(message))

Хотелось бы иметь возможность записи каждый раз, когда пользователь вводит неверный пароль и записывать дату и время, и причину, по которой он был недействительным в этом случае меньше 6 или больше 14

Ответы [ 3 ]

0 голосов
/ 25 марта 2019

Для первого программирования это действительно хороший код! В python очень легко записать текст в файл, и это можно сделать с помощью оператора with. Поскольку вы также хотите записать дату, вы можете использовать для этого встроенный модуль даты и времени Python. Я не знаю точно, как вы хотите структурировать его, так как кажется, что данные связаны, вы можете использовать реляционную базу данных, такую ​​как SQLite, но я оставлю это простым в текстовом документе. Измените свой код на while True на следующее:

with open("password_log.txt", 'a') as doc:
    date = datetime.now()
    dateString = datetime.strftime(date, "%m/%d/%Y %H:%M:%S")
    while True:
        if password_length < MIN_PASSWORD_LENGTH:
            doc.write("too short," + dateString + "\n")
            print("Password Rejected - Password must be between 6 and 14 characters long")
            password = input("Enter your password: ")
        elif password_length > MAX_PASSWORD_LENGTH:
            doc.write("too long," + dateString + "\n")
            print("Password Rejected - Password must be between 6 and 14 characters long")
            password = input("Enter your password: ")
        else:
            print("Password Accepted")
            break

В самый верх вашего кода входит from datetime import datetime. Не стесняйтесь спрашивать любые разъяснения о том, что это делает. Это заставит его работать по минимуму, также сохраняя любые журналы в CSV-подобном формате.

0 голосов
/ 25 марта 2019

Это улучшение ответа NightShade, но также и общее улучшение в целом. Это ваш первый раз, так что поздравляю. Я изменяю несколько вещей в вашем коде для удобства чтения, организации, эффективности, а также расширяемости и возможности повторного использования.

Если вы хотите, чтобы я что-то объяснил, пожалуйста, спросите. Кроме того, я изменил способ расчета надежности пароля, но его легко можно вернуть к исходному. РЕДАКТИРОВАТЬ: Как и другие пользователи предложили, вы не должны хранить пароли. Это нормально для упражнения, но вы должны выработать привычку защищать пароли. Если вы собираетесь создать систему входа в систему позднее, рассмотрите возможность хеширования пароля, сохранения его в безопасном месте и последующего сравнения входных данных хеширования с сохраненным хешем. Это добавляет некоторую защиту.

from datetime import datetime # importing the date module
MIN_PASSWORD_LENGTH = 6
MAX_PASSWORD_LENGTH = 14

# Auxilliary Functions
# Enclosing in functions so that they can be reused, separated and organized

def passCheck(input_password):
    date = datetime.now() 
    # sets the current date and time

    dateString = datetime.strftime(date, "%m/%d/%Y %H:%M:%S") 
    # formats the string to look like m/d/t h:m:s

    if len(input_password) < MIN_PASSWORD_LENGTH:
    # Using text formatting for cleanliness and readibility

        return(f"{dateString} ==> Password is too short: '{input_password}' (length = {len(input_password)})\n") 
    elif len(input_password) > MAX_PASSWORD_LENGTH:
        return(f"{dateString} ==> Password is too long: '{input_password}' (length = {len(input_password)})\n")
    else:
        return 0


def letter_analysis(input_password):
    special = ['!','@','#','$','%','^','&','*','(',')']
    letters_found = 0
    digits_found = 0
    specials_found = 0
    test = 0
    for ch in input_password:
    #Checking for isdigit(), isalpha() etc but adding everytime it finds it. You can change this.

        test = test + 1*ch.isdigit() 
        letters_found += 1 * ch.isalpha()
        digits_found += 1 * ch.isdigit()
        specials_found += 2 * (ch in special) 
        # I would suggest adding 2, for example, as special characters should be valued more

    return((letters_found and digits_found and specials_found, letters_found+digits_found+specials_found))
    #Returning a tuple where first index will be True if letters, digits and specials exist, and second index is the count.
    #Note: The count isn't a True count, since I'm counting special characters twice


## Main function

def main():
    input_password = input("Enter your password: ")
    try:
        with open("password_attempts.txt", "a") as passFile: 
        # Opening text file as append, so that it doesn't erase what's there

            passFile.write(passCheck(input_password)) 
            #Passing it the result of the check function.

        print(passCheck(input_password))
    except TypeError:
        print("Password Accepted") 
        #In case the return is 0, there will be TypeError. This is the case where it's accepted.

    strength = letter_analysis(input_password) 
    #strength now holds the tuple.

    evaluation = strength[0] + strength[1] 
    # Just an example. This is where strength is calculated and directly related to the letter analysis.

    if evaluation > 5:
    # Here you can use your judgement. I said 5 again as an example.
        print(f"Password is strong: '{input_password}' (length/evaluation = {len(input_password)}/{evaluation})")
    else:
        print(f"Password is weak: '{input_password}' (length/evaluation = {len(input_password)}/{evaluation})")
    main()

main()
0 голосов
/ 25 марта 2019

Я рекомендую использовать модуль logging в Python:

import logging
logging.basicConfig(filename='example.log',level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

Добавьте это к своему коду, где вы хотите войти. Вы можете использовать f-строки , чтобы изменить эти сообщения и также ввести пароль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...