7.6 密码设置与安全性分析(project)(安全意识)

目录

 

第1关 随机生成一个n位密码

第2关 将随机生成的n位密码MD5加密

第3关 生成黑客密码字典

第4关 模拟碰撞破解MD5密码

第5关 检查密码是否泄漏


第1关 随机生成一个n位密码

本关任务:编写一个能随机生成一个n位密码的小程序。

1pass01.txt 1pass02.txt 1pass03.txt

Linux密码中支持的特殊字符有:" ~ @#^*%/.+:;=";windows密码中支持的特殊字符有:" ~ @/+:"; 本关要求从“十进制数字+小写大写字母+windows密码中支持的特殊字符”中随机取m个不重复的字符拼接为一个表示字符串做为密码,m是用户输入的整数,同时也用整数m做随机数的种子。

import string
import random


def generate_password(n: int) -> str:
    """接受一下整数,产生一个n位的密码,返回字符串
    windows密码中支持的特殊字符有:"~@_/+:"
    Linux密码中支持的特殊字符有:"~@#_^*%/.+:;="
    """
    # 补充你的代码
    content = string.digits + string.ascii_letters +"~ @/+:" #4SZ1qXQv h  4SZ1qtQv/h
    result = ''.join(random.sample(content, n))
    return result

if __name__ == '__main__':
    m = int(input())
    random.seed(m)
    print(generate_password(m))

第2关 将随机生成的n位密码MD5加密

本关任务:编写一个将随机生成的n位密码MD5加密的小程序。

相关知识

为了完成本关任务,你需要掌握:

1.hashlib包 2.hashlib.md5()

import string
import random
import hashlib

def generate_password(n: int) -> str:
    """接受一下整数,产生一个n位的密码,返回字符串
    windows密码中支持的特殊字符有:"~@_/+:"
    Linux密码中支持的特殊字符有:"~@#_^*%/.+:;="
    """
    # 补充你的代码
    content = string.digits + string.ascii_letters +"~ @/+:" #4SZ1qXQv h  4SZ1qtQv/h
    result = ''.join(random.sample(content, n))
    return result

def make_md5(password: str) -> str:
    """接收一个字符串,用md5加密后转为16进制,返回加密后的字符串"""
    # 补充你的代码
    pass_byte = bytes(password, 'utf-8')
    pass_md5 = hashlib.md5(pass_byte).hexdigest() 
    return pass_md5 


if __name__ == '__main__':
    m = int(input())
    random.seed(m)
    password_str = generate_password(m)
    password_str_md5 = make_md5(password_str)
    # 补充你的代码,输出预期结果
    print(f'产生的密码是:{password_str},MD5加密结果为{password_str_md5}')

第3关 生成黑客密码字典

本关任务:编写一个能生成黑客密码字典的小程序。

import string
import hashlib


def generate_password(n: int) -> str:
    """接受一下整数,产生一个n位的密码,返回字符串
    windows密码中支持的特殊字符有:"~@_/+:"
    Linux密码中支持的特殊字符有:"~@#_^*%/.+:;="
    """
    # 补充你的代码
    content = string.digits + string.ascii_letters +"~ @/+:" #4SZ1qXQv h  4SZ1qtQv/h
    result = ''.join(random.sample(content, n))
    return result


def make_md5(password: str) -> str:
    """接收一个字符串,用md5加密后转为16进制,返回加密后的字符串"""
    # 补充你的代码
    pass_byte = bytes(password, 'utf-8')
    pass_md5 = hashlib.md5(pass_byte).hexdigest() 
    return pass_md5 


def generate_pass_dic(file: str) -> dict:
    """接收文件名,以其md5加密结果为键、用文件中的密码为值构建字典,返回字典"""
    # 补充你的代码
    dic = {}
    with open(file) as f:
        content = f.readlines()
    for x in content: # 遍历文件对象
        x = x.strip()
        y =   make_md5(x)
        dic.update({x: y})
    return dic

def output(pass_dic: dict, n: int) -> None:
    """接收密码字典和整数n,按加入顺序输出前n项,无返回值"""
    # 补充你的代码
    dic1 = list(pass_dic.items())
    #print(dic1)
    for i in range(n):
        print(f'密文{dic1[i][1]}对应明文密码为{dic1[i][0]}') 


if __name__ == '__main__':
    m = int(input())
    filename = '/data/bigfiles/1pass00.txt'
    password_dic_md5 = generate_pass_dic(filename)
    output(password_dic_md5, m)

第4关 模拟碰撞破解MD5密码

本关任务:编写一个能生成黑客密码字典的小程序。

因为MD5密码不可逆,不可通过程序解密明文,所以遇到MD5加密的密码时,可行的方法将其MD5加密后的密码与黑客字典中的密文比对,若相同,则字典中的密文对应的字符串就是密码明文。

import hashlib


def make_md5(password: str) -> str:
    """接收一个字符串,用md5加密后转为16进制,返回加密后的字符串"""
    # 补充你的代码
    pass_byte = bytes(password, 'utf-8')
    pass_md5 = hashlib.md5(pass_byte).hexdigest() 
    return pass_md5 


def generate_pass_dic(file: str) -> dict:
    """接收文件名,以其md5加密结果为键、用文件中的密码为值构建字典,返回字典"""
    # 补充你的代码
    dic = {}
    with open(file) as f:
        content = f.readlines()
    for x in content: # 遍历文件对象
        x = x.strip()
        y =   make_md5(x)
        dic.update({x: y})
    return dic


def crack_password(pass_dic: dict, pass_str: str) -> str:
    """接收密码字典和整数n,按加入顺序输出前n项,无返回值"""
    # 补充你的代码
    dic1 = list(pass_dic.items())
    for i in dic1:
        if pass_str ==i[1]:
            return i[0]
   
    
if __name__ == '__main__':
    password_str = input()
    filename = '/data/bigfiles/1pass00.txt'
    password_dic_md5 = generate_pass_dic(filename)
    password = crack_password(password_dic_md5, password_str)
    if password:
        print(f'密文{password_str}的明文是{password}')
    else:
        print(f'密文{password_str}的明文未能破解')

第5关 检查密码是否泄漏

本关任务:编写一个能检查密码是否泄漏的小程序。

本关要求根据文件“1pass00.txt”“1pass01.txt”“1pass02.txt”“1pass03.txt”是泄漏在网络上的用户密码明文,生成一个黑客字典。将文件中的密码明文用MD5加密,用密文做键,明文为值构建字典。用户输入一个明文密码字符串,检查黑客字典中是否存在以确定密码是否被泄漏。

import hashlib


def make_md5(password: str) -> str:
    """接收一个字符串,用md5加密后转为16进制,返回加密后的字符串"""
    # 补充你的代码
    pass_byte = bytes(password, 'utf-8')
    pass_md5 = hashlib.md5(pass_byte).hexdigest() 
    return pass_md5 
    


def generate_pass_dic(file: str) -> dict:
    """接收文件名,以其md5加密结果为键、用文件中的密码为值构建字典,返回字典"""
    # 补充你的代码
    dic = {}
    with open(file) as f:
        content = f.readlines()
    for x in content: # 遍历文件对象
        x = x.strip()
        y =   make_md5(x)
        dic.update({x: y})
    return dic


def read_txt() -> dict:
    """无参数,读取多个文件,将其中的密码用md5加密后存于字典"""
    path = '/data/bigfiles/'
    file_ls = ['1pass00.txt', '1pass01.txt', '1pass02.txt', '1pass03.txt']
    # 补充你的代码
    for i in file_ls:
        position = path + "/"+ i 
        return generate_pass_dic(position)


def check_pass(leaked_pass_dic:dict, pass_str_md5: str):
    """检查用户的密码是否在泄漏密码库中存在,存在时返回明文,不存在时返回None"""
    # 补充你的代码
    #print(leaked_pass_dic)
    for i in leaked_pass_dic:
        if password_str == i:
            return password_str
    return False

if __name__ == '__main__':
    password_str = input()
    password_str_md5 = make_md5(password_str)
    leaked_pass_dict = read_txt()
    result = check_pass(leaked_pass_dict, password_str_md5)
    if result:
        print(f'你的密码是{result},你的密码在泄漏密码字典中')
    else:
        print('你的密码安全')

猜你喜欢

转载自blog.csdn.net/m0_70456205/article/details/130443319
7.6