Python 每日一练(7)
引言
- 今天的练习比较轻松,原本是有两题的,但是第一题那个大致看了一下,其实和之前的6个练习差不多,就是把
xls中的文件数据读取出来后,进行一下处理,对于那题而言就是一个求和操作,所以就没练了,所以今天的主要对象是第21题 - 这题是需要我们对于一个密码进行加密操作,由于在比赛中做密码比较多的原因,这题难度其实就没那么大了,主要涉及的库有
hashlib和hamc
题目分析
- 作为了解,我们应该知道,当我们注册了一个平台的账户时,我们存储的密码在后端的数据库中,是以一串哈希摘要的形式存储的,这样保证了即使是存储方也无法获取用户的明文密码(但是他还是可以登录你的平台账户,因为常规来说,登录就是用着摘要来验证的),从而保证了信息的安全性
- 对于哈希函数,我们一般常用的有
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位做为密码,长度上已符合
Python 每日一练(7)的更多相关文章
- python每日一练:0007题
第 0007 题: 有个目录,里面是你自己写过的程序,统计一下你写过多少行代码.包括空行和注释,但是要分别列出来. # -*- coding:utf-8 -*- import os def count ...
- [python每日一练]--0012:敏感词过滤 type2
题目链接:https://github.com/Show-Me-the-Code/show-me-the-code代码github链接:https://github.com/wjsaya/python ...
- Python 每日一练 | Flask 实现半成品留言板
留言板Flask实现 引言 看了几天网上的代码,终于写出来一个半成品的Flask的留言板项目,为什么说是半成品呢?因为没能实现留言板那种及时评论刷新的效果,可能还是在重定向上有问题 或者渲染写的存在问 ...
- Python 每日一练(5)
引言 Python每日一练又开始啦,今天的专题和Excel有关,主要是实现将txt文本中数据写入到Excel中,说来也巧,今天刚好学校要更新各团支部的人员信息,就借此直接把事情做了 主要对于三种数据类 ...
- Python 每日一练(4)
引言 今天继续是python每日一练的几个专题,主要涵盖简单的敏感词识别以及图片爬虫 敏感词识别 这个敏感词的识别写的感觉比较简单,总的概括之后感觉功能可以简略成if filter_words in ...
- Python 每日一练(3)
引言 今天的每日一练,学习了一下用Python生成四位的图像验证码,就是我们常常在登录时见到的那种(#`O′) 思路分析 正如常见的那种图像验证码,它是由数字和字母的随机组合产生的,所以我们首先的第一 ...
- Python每日一练(1)
这两天在做Python的每日一练,感觉收获颇丰,所以来记录分享一下,一共做了三个,涉及socket,PIL,pymysql三个库,另外终于开始了Flask框架的学习,后续也会做出一些分析 第一个是一个 ...
- Python 每日一练(2)
引言 我又双叒叕的来啦,新博客的第二篇文章,这次是继之前公众号上每日一练的第二个,这次是专题实对于文件的一些处理的练习 主要有以下几类: 1.实现英文文章字频统计 2.统一剪裁某一指定目录下的所有图片 ...
- Python每日一练(1):计算文件夹内各个文章中出现次数最多的单词
#coding:utf-8 import os,re path = 'test' files = os.listdir(path) def count_word(words): dic = {} ma ...
随机推荐
- mysql查询表内所有字段名和备注
select distinct column_name as 字段名,column_comment as 字段备注 from information_schema.columns where tabl ...
- 解决python语言的工具pycharm以及Windows电脑安装pygame模块的问题
人生苦短,我用python,python作为一门当今时代潮流性的语言,已经成为大多数的年轻程序猿们向往的目标,python中有许多的库, 其中有一个pygame库是作为开发2D游戏必不可少的开发库,是 ...
- CentOS-6.5操作系统安装
1.创建Linux虚拟机(如图所示) 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18 ...
- 《C程序设计语言》 练习2-1
问题描述 编写一个程序以确定分别由signed及unsigned限定的char.short.int及long类型变量的取值范围.采用打印标准头文件中的相应值以及直接计算两种方式实现 Write a p ...
- 还在用迭代器处理集合吗?试试Stream,真香
前言 上一篇博客一文带你深入了解 Lambda 表达式和方法引用我给大家介绍了 Java8 函数式特性中的 Lambda,这篇文章我将继续讨论 stream 流的用法 声明:本文首发于博客园,作者:后 ...
- 仿站-获取网站的所有iconfont图标
在仿站过程中,网站的iconfont查找非常浪费时间,这里教大家一次性获取网站iconfont的方法 1.打开 开发者工具 在element中搜索font-face,结果如下,复制font-face所 ...
- Day_08【面向对象】扩展案例4_年龄为30岁的老王养了一只黑颜色的2岁的宠物……
#分析以下需求,并用代码实现: 1.定义动物类 属性: 年龄,颜色 行为: eat(String something)方法(无具体行为,不同动物吃的方式和东西不一样,something表示吃的东西) ...
- 【Hadoop离线基础总结】oozie调度shell脚本
目录 1.解压官方提供的调度案例 2.创建工作目录 3.拷贝任务模板到工作目录当中去 4.随意准备一个shell脚本 5.修改模板下的配置文件 6.上传调度任务到hdfs上面去 7.执行调度任务 1. ...
- python之unittest验证函数功能
一.待验证脚本 首先,有如下三个脚本,分别对应三个函数 分别导入模块行,如下: from fuction1 import fu1 from fuction2 import fu2 from fucti ...
- sql 取值时将字符串类型数字转化成整形
select cast(a.Vchcode as int) as avchcode,a.ptypeid,a.assqty,unit,b.pfullname,b.standard,b.type from ...