Fork me on GitHub

Python 每日一练(7)

引言

  • 今天的练习比较轻松,原本是有两题的,但是第一题那个大致看了一下,其实和之前的6个练习差不多,就是把xls中的文件数据读取出来后,进行一下处理,对于那题而言就是一个求和操作,所以就没练了,所以今天的主要对象是第21题
  • 这题是需要我们对于一个密码进行加密操作,由于在比赛中做密码比较多的原因,这题难度其实就没那么大了,主要涉及的库有hashlibhamc

题目分析

  • 作为了解,我们应该知道,当我们注册了一个平台的账户时,我们存储的密码在后端的数据库中,是以一串哈希摘要的形式存储的,这样保证了即使是存储方也无法获取用户的明文密码(但是他还是可以登录你的平台账户,因为常规来说,登录就是用着摘要来验证的),从而保证了信息的安全性
  • 对于哈希函数,我们一般常用的有sha256,md5等,这一类函数都有一个共同点就是全是单向函数,即无法根据哈希直接逆推回明文
  • Python中常用的处理哈希的库就是hashlib了,除此之外,这次练习,我们可以考虑另一个库hmac
  • 我们这次去实现加密是利用哈希加盐这种方式,使得在计算哈希的时候,不能仅针对原始输入计算,需要增加一个salt来使得相同的输入也能得到不同的哈希,这样可以确保密码的更加安全,因为黑客对于一些md5值,可以利用彩虹表进行逆推出明文,而加了盐之后,使其在不知道salt的情况下更加无法逆推明文。
  • 对于hashlib的加密实现加盐仅是这样md5(password+salt),而hmac来实现的话则是把salt看做一个“口令”,加salt的哈希就是:计算一段message的哈希时,根据不通口令计算出不同的哈希。要验证哈希值,必须同时提供正确的口令。
  • 这样来说,其实hmac更符合我们的要求,但就加密来说,我们使用hashlib的哪种方式也可以实现了

代码示例:

# -*- coding:utf-8 -*-
# Author:Konmu
'''
 通常,登陆某个网站或者 APP,需要使用用户名和密码。
 密码是如何加密后存储起来的呢?请使用 Python 对密码加密。
'''

import hashlib
from hmac import HMAC
import random

def Passwd_Encrypt(password,salt=None):
    if(salt is None):
        salt = ''.join([chr(random.randint(48,122)) for i in range(20)])
        safe_pass = hashlib.md5((password+salt).encode('utf-8')).hexdigest()[:10] #hashlib的方式
    else:
        safe_pass = HMAC(bytes(password.encode('utf-8')),bytes(salt.encode('utf-8')),hashlib.md5).hexdigest()[:10]
        #hmac算法实现,这个算法只能处理字节型数据,所以要进行一下类型转换
    return(safe_pass)

if __name__ == "__main__":
    old_pass = input("Please input your password:")
    salt = "iamsalt"
    new_pass1 = Passwd_Encrypt(old_pass)
    new_pass2 = Passwd_Encrypt(old_pass,salt)
    print("Your safe password:",new_pass1)
    print("Your safe password:",new_pass2)

加密结果

Please input your password:K0nmua4
Your safe password: ea2cd5c2fb
Your safe password: 1bf06bf616
由于通常我们注册账户使用的密码在8~18位,所以我们这里选择返回前10位做为密码,长度上已符合
posted @ 2020-03-27 20:02  Konmu  阅读(221)  评论(0编辑  收藏  举报