hashlib 模块用来进行hash

hashlib的基本概述:

  python中的 hashlib 模块用来进行hash 或者md5加密,而且这种加密是不可逆的,所以这种算法又被称为摘要算法,

其支持Opennssl库提供的所有算法,包括 md5、sha1、sha224、sha256、sha512 等。

 

 

hash是一种算法 是将一个任意长的数据 根据计算 得到一个固定长度特征吗

 特征:1、不同输入   可能会有相同的结果 几率特别小

    2、相同的输入 必然得到相同结果

    3、由于散列(特征)的性质 从原理来看是不可能 反解

    4、用来 验证   两个输入的数据是否一致

 使用场景

   1、密码验证

   2、验证数据是否被篡改  比如游戏安装包    有没有被改过

 为了防止别人撞库成功  可用提升密码的复杂度   其次可以为密码加盐(加点内容进去)

ps:撞库破解的原理  把常见的 明文和密文的对应关系 存到了数据库中  运气好就能查询到

 

常用的属性方法

  algorithms : 列出所有加密算法

  digesti——size: 产生的散列的字节大小

  md5()/sha1() :创建一个 md5 或者 sha1加密模式的hash 对象

  update(arg) :用字符串参数来更新hash对象,如果同一个has对象重复调用该方法,如下:m.update(a); m.update(b), 则等于m.update(a+b)

  digest() : 返回摘要,作为二进制数据字符串值

  hexdigest() : 返回摘要,作为十六进制数据字符串值

  copy() :复制

 

下面是一个简单的实例:

import  hashlib
m = hashlib.md5("aaa".encode("utf-8"))
print(m.hexdigest())

结果如下:

47bce5c74f589f4867dbd57e9ca9f808

 

下面是一个简单的加盐实例:

import  hashlibm = hashlib.md5("321".encode("utf-8"))
#
m.update("abcdefplkjoujhh".encode("utf-8"))print(m.hexdigest())

结果如下:

7da0befdd8fd811dd0716941c38c0111

 

关于hmac 的实例:

import hmac
# 与hashlib 没啥区别 只是在创建的时候必须加盐
h = hmac.new("abcdefjjjj".encode("utf-8"))h.update("123".encode("utf-8"))print(h.hexdigest())

结果如下:

944b3523fac69f32f6d399a11707da8b

 

如何产生hash值的三个阶段:

import hashlib
# # ######## sha256 ########
# # 1、造出hash工厂
hash = hashlib.sha256('12345ds232'.encode('utf8'))     #同一种hash算法得到的长度是固定的
# # 2、运送原材料
hash.update('alvin'.encode('utf8'))                     #工厂传入的原材料都是bytes类型
# # 3、产出hash值
print(hash.hexdigest())                     #结果:0f63932f6e2b2d1e0d9c2d50f0e9d39b79da78a5048a6d054d7f9c27d1a8761a

 

效验文件的一致性(如何保证下载的文件过程中不丢包,保证数据的完整性!):

# -----------文件一致校验----------------
'''可以拷贝一个文件放在两个不同的盘中,然后通过判断两个文件的hash值是否相等,判断两个文件是否是同一个文件'''
import hashlib
m = hashlib.md5()
with open(r'F:\oldboy课程记录\目录创建函数.py','rb') as f:for line in f:m.update(line)
print(m.hexdigest())          #18b6754864943d03b5b2aedacb449466import hashlib
m = hashlib.md5()
with open(r'F:\oldboy课程记录\购物车练习.py','rb') as f:for line in f:m.update(line)
print(m.hexdigest())           #8e63f67a0049d1fc583a5c2bbf6cf3a8

 

对密码进行加盐(加密):

# 应用:对明文密码进行加密(暴力破解-------用明文密码用一种算法算出一个hash值,与截取的hash值进行比对,比对成功说明明文密码一致,就可以破解用户的密码)
'''如用户在某网站进行注册信息,这个时候防止信息被恶意拦截获取,可以对用户明文密码进行加密,存成hash值得形式,这样用户每次登陆虽然输的是明文密码,校验hash值即可'''
#未加密
password=input('>>>>>:').strip()
import hashlib
m=hashlib.md5()
m.update(password.encode('utf-8'))
print(m.hexdigest())             #00dcbdaede875d5e23f1f9f64c7849ef# 对密码进行加盐(暗号)----------进一步加强密码的安全性
password=input('>>>>>:').strip()
import hashlib
m=hashlib.md5()
m.update('一行白鹭上青天'.encode('utf-8'))         #对密码加盐
m.update(password.encode('utf-8'))
print(m.hexdigest())  

 

hmac模块的加密方式,与hashlib差不多:

'''python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 进行进一步的处理然后再加密:'''
import hmac
h = hmac.new('天王盖地虎'.encode('utf8'))          #hmac必须要加盐
h.update('hello'.encode('utf8'))
print(h.hexdigest())                 #1abaae8f65f68f2695a8545c5bc8e738#要想保证hmac最终结果一致,必须保证:
#1:hmac.new括号内指定的初始key一样
#2:无论update多少次,校验的内容累加到一起是一样的内容

# 下面单重方式得到的结果是一样的
import hmac
h1=hmac.new(b'tom')          #初始值必须保证一致,最终得到的结果就会不一样
h1.update(b'hello')
h1.update(b'world')
print(h1.hexdigest())h2=hmac.new(b'tom')         #初始值必须保证一致,最终得到的结果就会不一样
h2.update(b'helloworld')
print(h2.hexdigest())h3=hmac.new(b'tomhelloworld')   #初始值不一样,所以与上面两种的结果不一样
print(h3.hexdigest())

结果如下:

0426ccec3b134e8c18fdcefee841ef25
0426ccec3b134e8c18fdcefee841ef25
ff1214d895bbaf5f1847db4ebae8212e

 

破解用户的密码

# 重点
'''模拟撞库破解密码'''
import hashlib
passwds=[                      #可以通过random实现对passwds中的内容'alex3714','alex1313','alex94139413','alex123456','123456alex','a123lex',]def make_passwd_dic(passwds):                #通过明文密码列表,造出与之对应的hash值得字典dic={}for passwd in passwds:m=hashlib.md5()                      #使用md5算法,造了一个工厂m.update(passwd.encode('utf-8'))     #给工厂运送原材料(即我们要加密的内容)dic[passwd]=m.hexdigest()            #产出hash值(即最终的产品),将其加入到我们事先造好的空字典中,字典形式:{密码:hash值}return dicdef break_code(cryptograph,passwd_dic):      #判断拦截的hash值是否与字典中事先造好的hash值相等,相等则说明成功进行破解for k,v in passwd_dic.items():if v == cryptograph:print('密码是===>\033[46m%s\033[0m' %k)cryptograph='aee949757a2e698417463d47acac93df'     #我们拦截拿到的密码,经过加密的hash值
break_code(cryptograph,make_passwd_dic(passwds))   #将要破解的密码hash值,和事先造好的hash的字典当做函数的实参传给对应的形参

 

转载于:https://www.cnblogs.com/TF511/p/9818605.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279132.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Ubuntu 11.10中将窗口按钮移回右侧

As of Ubuntu 10.04, the minimize, maximize, and close buttons on all windows were moved to the left side and the system menu was removed. Prior to version 11.10, you could use several methods to restore the original button arrangement. 从Ubuntu 10.04开始&a…

java测试开发_测试开发系类之Java常用知识点

测试需要的两门语言:Java,Python测试开发:开发测试脚本->开发测试框架Java需要掌握内容:基础语法、Java面向对象相关概念、Java常用类、基础测试框架Java常用类:IO相关类,包括:字节流InputSt…

kafka 服务端消费者和生产者的配置

在kafka的安装目录下,config目录下有个名字叫做producer.properties的配置文件 #指定kafka节点列表,用于获取metadata,不必全部指定 #需要kafka的服务器地址,来获取每一个topic的分片数等元数据信息。 metadata.broker.listkafka0…

如何在Windows 10上使用触摸板手势

If you’ve used a touchpad in Windows 10, you’re no doubt aware of the basic single-finger tapping and two-finger scrolling gestures. Windows 10 also packs in some additional gestures you might not have tried. 如果您在Windows 10中使用了触摸板,那…

java全栈开发工程师_谈谈我对Java(J2EE)全栈工程师的理解

很多刚从事Java开发的同学都有一个疑问,到底是向全栈式程序员方向发展还是做精通某种技术的专才?对于这个问题也是见仁见智。 在给出我的观点之前,我们先来分析一下全栈工程师的种类和专才的种类 ,之后关于这个问题的答案就很清楚…

多网卡命名规则

使用iptables做nat路由,需要几张网卡,以下命令很有用 1.首先你要先确认你系统加载的网卡,lspci|grep -i eth,如果出现unknow情况或者未识别,最好换网卡,或者是驱动没有加载,需要到/lib/modules的子目录driv…

相机模拟光圈_我的相机应该使用什么光圈?

相机模拟光圈Aperture, along with shutter speed and ISO, is one of the three most important settings you control when you take a photo. It affects both the amount of light that hits your camera sensor and the depth of field of your images. Let’s look at ho…

2018-2019-1 20165234 《信息安全系统设计基础》第四周学习总结

一、学习目标 了解ISA抽象的作用 掌握ISA,并能举一反三学习其他体系结构 了解流水线和实现方式二、学习内容 Y86-64指令 movq指令 irmovq rrmovq mrmovq rmmovq四个整数操指令 addq,subq,andq,xorq只对寄存器数据进行操作7个跳转指令 cmovle cmovl cmove cmovne cmo…

python数据库实例_Python3.6简单的操作Mysql数据库的三个实例

安装pymysql参考:https://github.com/PyMySQL/PyMySQL/pip install pymsql实例一import pymysql# 创建连接# 参数依次对应服务器地址,用户名,密码,数据库conn pymysql.connect(host127.0.0.1, userroot, passwd123456, dbdemo)# …

Python之钉钉机器人推送天气预报

通过Python脚本结合钉钉机器人,定时向钉钉群推送天气预报 #!/usr/bin/python # -*- coding: utf-8 -*- # Author: aikergdedu.ml # My blog http://m51cto.51cto.blog.com import requests import re import urllib2 import json import sys import osheaders {Co…

google +按钮_如何禁用或改善Google的Google+集成

google 按钮If you’ve used Google lately, you’ve probably seen Google taking over Google’s search results. You don’t have to put up with it — you can disable the integration, show better social-networking pages or hide those pesky Google notifications.…

P2680 运输计划

传送门 十分显然完成工作的时间和航耗时最长的运输计划有关 所以题目意思就是要求最大值最小 所以可以想到二分 把所有大于mid时间的航线打上标记,显然删边只能在所有这些航线的公共路径上 要如何快速打标记是个问题 二分已经有一个log,所以只能承受O(n)…

java 集合读写同步_JAVA多线程学习十六 - 同步集合类的应用

1.引言在多线程的环境中,如果想要使用容器类,就需要注意所使用的容器类是否是线程安全的。在最早开始,人们一般都在使用同步容器(Vector,HashTable),其基本的原理,就是针对容器的每一个操作,都添加synchronized来进行同…

Linux下的parted工具的使用 GPT分区安装系统

安装系统是安装前时候ctrlatlF2 fdisk -l parted select /dev/sdb mklabel msdos # 将GPT磁盘格式化为MBR磁盘 对大硬盘进行分区 xfs 和 ntfs Linux下的parted工具的使用也很简单,具体操作如下: rootme:/mnt# parted /dev/sda Using /dev/sda Welcome to…

ubuntu自定义菜单_如何自定义Ubuntu的每日消息

ubuntu自定义菜单Ubuntu displays an informative message, known as the message of the day, when a user logs in at the terminal. The MOTD is fully customizable — you can add your own text and other dynamic data. 当用户在终端上登录时,Ubuntu将显示信…

java避免使用orderby_java – @OrderBy在JPA中无法正常工作

OrderBy如何运作?它在以下代码中不起作用:Employee.javapackage com.semanticbits.pojo;import java.util.List;import javax.persistence.CascadeType;import javax.persistence.Embedded;import javax.persistence.Entity;import javax.persistence.Ge…

BigDecimal四舍五入与保留位

1.引言 借用《Effactive Java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果&#…

火狐web开发清楚缓存_如何使用Firefox的Web开发工具

火狐web开发清楚缓存Firefox’s Web Developer menu contains tools for inspecting pages, executing arbitrary JavaScript code, and viewing HTTP requests and other messages. Firefox 10 added an all-new Inspector tool and updated Scratchpad. Firefox的Web Develop…

Leetcode400Nth Digit第N个数字

在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 个数字。 注意: n 是正数且在32为整形范围内 ( n < 231)。 示例 1: 输入: 3 输出: 3 示例 2: 输入: 11 输出: 0 说明: 第11个数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是0&#xff0c;它是…

Java基类共同属性设置_多选择基类的访问属性-Java初学笔记

多选择基类的访问属性你现在知道在定义类的访间属性时可用的选择项&#xff0c;你希望使用这些类定义子类。你知道在类继承上这些属性所具有的效果&#xff0c;但是你如何决定到底应该使用哪一个呢?这里没有死板和现成的规则&#xff0c;你选择的访问属性取决于在将来你想用类…