自制密码管理器 —— 使用python、RSA加密文件(加强版)

本文介绍了如何使用Python和RSA加密技术制作一个密码管理器的2.0版本。在管理员首次设置时,通过哈希运算和随机数生成AES密钥,用于加密私钥和截取规则。登录验证时,用户输入的密钥经过特定步骤解密资料,确保数据始终加密且不保存明文。这是一个Python学习实践项目,旨在提高密码管理的安全性。
摘要由CSDN通过智能技术生成

  
  
  (点击下面蓝色字体文字跳转到该链接)
  
  1.0 版本的代码和注释,请到 自制密码管理器 —— 使用python、RSA加密文件 这里查看,对于你理解下面的代码会有帮助。

  2.0 版本的效果如下面的视频:
  视频演示链接:python密码管理器 2.0 版本
  
  

学习笔记

主要思路:

  第一次登记管理员信息时,管理员输入密钥(一段中/英文本+数字/字母),代码将该输入的信息中的中/英文本进行哈希运算

(以下部分代码看不明白没关系,看注释,知道思路要做什么就行了,详细注释在文末)

print('\n\t【密钥格式】:(文本)(一个空格)(一段数字/字母)')
whatsay = (input('\t\t'+'可以说一句喜欢的话,再接几个数字/字母:  ')).split(' ')   
lenth = random.randint(9,16)
#获取随机字符的方法:先获取随机ASCII码,再转成字符型
beg,ex_1,ex_2 = random.randint(0,200),chr(random.randint(
                             48,57)),chr(random.randint(97,122))
new_rule = {
   'rule':{
   'beg':beg,'len':lenth,'ex_1':ex_1,'ex_2':ex_2}}

  使用随机数截取哈希运算结果随机长度,作为AES的密钥,用于加密私钥,此处称AES密钥为key,这些随机的结果作为截取规则

def get_hash(text,rule,lenth=None):
    m = hashlib.sha512()
    m.update(text.encode('utf-8'))
    pwd = m.hexdigest()
    beg,lent = int(rule['beg']),int(rule['len'])
    ex_1,ex_2 = rule['ex_1'],rule['ex_2']
    lenth = lenth if lenth is not None else lent
    pwd = pwd.replace(ex_1,ex_2) #字符替换
    pwd = str(pwd)[beg:lenth+beg] #截取长度
    return pwd

key = get_hash(whatsay[0],new_rule,lenth=None) #处理中/英文文本信息

  接着代码使用输入信息中的数字/字母文本进行填充随机字符,补够16位作为AES的密钥,用于加密上述随机截取哈希结果字符串的截取规则,此处称AES密钥为ekey

def get_key(key,rule=1):
    c = 'c'
    if isinstance(rule,dict):
       key = get_hash(key,rule)
       c = rule['ex_2']
   if len(key)<17:
       key = key.ljust(16,c) #补充到16位
   key = key.encode('utf-8')
   return key

ekey = get_key(whatsay[1],rule=new_rule) #将数字/字母文本处理

  随后,使用ekey加密截取规则,使用key加密私钥,使用生成的公钥将账号信息资料进行加密(为什么还要单独保存随机规则?为了后面验证身份的时候。仅仅提取出规则部分验证就行了,如果只放在数据里,就做不到验证的效果)

#super()表示父类的方法调用

super().get_key(whatsay[1]) #获取到ekey,加密随机截取规则
encrypt_ekey = str(super().aes_encrypt(str(new_rule)), encoding = "utf8")
super().lock_file_ekey(encrypt_ekey) #将密文保存到文件
'———————————————————————————————————————'
super().get_key(whatsay[0],new_rule['rule']) #获取到key,加密私钥
encrypt_priv = str(super().aes_encrypt(priv_key), encoding = "utf8")
super().lock_file_priv(encrypt_priv) #将密文保存到文件
'———————————————————————————————————————'
data.update(new_cipher)
data.update(new_rule)
self.save_lock_data(data) #将账户信息和加密规则一起加密保存到文件

  将保存在密码文件的文本信息分组,截取规则放在第一部分,私钥放在第二部分,资料放在第三部分,下次登陆验证时,先提取出第一部分的密文,将用户输入的密钥分成两段,用第二段尝试去解密第一部分的截取规则,如果解密成功则表示密钥的数字/字母文本部分正确
  接着将得到的规则(明文)、和第一段(用户输入的中英文本信息)放进哈希处理函数中,解开得到一段字符串(私钥),将该字符串用于去解密第三部分的资料,如果解密成功,则表示用户输入错误,否则报错返回

def check():
    data = {
   }
    str_ekey_encrypt = super().unlock_file_ekey() #读取密文的第一部分(关于截取规则的密文)
    while True:
         keys = input('\n'+'请输入密钥:  ')
         if keys=='q' or keys=='Q':
            break
         try:
            super().get_key(keys.split(' ')[1])#将第一段用于解密第一部分的密文
            str_ekey = super().aes_decrypt(str_ekey_encrypt) #如果报错则跳出try
            dict_rule = eval(str_ekey)['rule']#如果解密成功,则得到的明文(截取规则)
            str_priv_encrypt = super().unlock_file_priv()#读取密文的第二部分内容
            super().get_key((keys.split(' ')[0]),dict_rule)#哈希处理得到key,用key去解密密文的第二部分(私钥)
            priv_key = super().aes_decrypt(str_priv_encrypt)#如果解密成功,得到私钥的明文
            str_data_encrypt = super().unlock_file_data()#读取密文的第三部分
            dict_data = eval(super().rsa_decrypt((bytes(str_data_encrypt,encoding = "utf8"))))#尝试用私钥去解密,如果成功,则可以得到账户信息
            admin = list(dict_data.keys())[0]
            pub_key = dict_data[admin]['value']
            return dict_data
        except Exception as e:
            print('\n'+'请输入正确的密钥!(输入【q】退出)')

  到这里,就是整个加密解密的流程,保证了在密码文件中的数据永远是密文,只有在用户输入信息时才尝试解密,并且明文从不保存到文件中,相当于在线加密解密

'''
By Afeng
date:2020/02/29
virsio
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值