加密算法介绍

一,HASH

  Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。

  简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

  HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值.也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系

二,MD5

2.1 什么是MD5算法

  MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位的散列值(hash value),用于确保信息传输完整一致。MD5的前身有MD2、MD3和MD4。

2.2 MD5功能

  输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);
  不同的输入得到的不同的结果(唯一性);

2.3 MD5算法的特点

  1. 压缩性:任意长度的数据,算出的MD5值的长度都是固定的
  2. 容易计算:从原数据计算出MD5值很容易
  3. 抗修改性:对原数据进行任何改动,修改一个字节生成的MD5值区别也会很大
  4. 强抗碰撞:已知原数据和MD5,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

2.4 MD5算法是否可逆?

MD5不可逆的原因是其是一种散列函数,使用的是hash算法,在计算过程中原文的部分信息是丢失了的。

2.5 MD5用途

    1. 防止被篡改:

      • 比如发送一个电子文档,发送前,我先得到MD5的输出结果a。然后在对方收到电子文档后,对方也得到一个MD5的输出结果b。如果a与b一样就代表中途未被篡改。

      • 比如我提供文件下载,为了防止不法分子在安装程序中添加木马,我可以在网站上公布由安装文件得到的MD5输出结果。

      • SVN在检测文件是否在CheckOut后被修改过,也是用到了MD5.

    2. 防止直接看到明文:

      • 现在很多网站在数据库存储用户的密码的时候都是存储用户密码的MD5值。这样就算不法分子得到数据库的用户密码的MD5值,也无法知道用户的密码。(比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。)
    3. 防止抵赖(数字签名):

      • 这需要一个第三方认证机构。例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并做好记录。若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,就证明是A写的了。这就是所谓的“数字签名”。

三,SHA-1

  安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。

  SHA是美国国家安全局设计的,由美国国家标准和技术研究院发布的一系列密码散列函数。

  由于MD5和SHA-1于2005年被山东大学的教授王小云破解了,科学家们又推出了SHA224, SHA256, SHA384, SHA512,当然位数越长,破解难度越大,但同时生成加密的消息摘要所耗时间也更长。目前最流行的是加密算法是SHA-256 .

四,MD5与SHA-1的比较

  由于MD5与SHA-1均是从MD4发展而来,它们的结构和强度等特性有很多相似之处,SHA-1与MD5的最大区别在于其摘要比MD5摘要长32 比特。对于强行攻击,产生任何一个报文使之摘要等于给定报文摘要的难度:MD5是2128数量级的操作,SHA-1是2160数量级的操作。产生具有相同摘要的两个报文的难度:MD5是264是数量级的操作,SHA-1 是280数量级的操作。因而,SHA-1对强行攻击的强度更大。但由于SHA-1的循环步骤比MD5多80:64且要处理的缓存大160比特:128比特,SHA-1的运行速度比MD5慢。

Python的 提供的相关模块

  用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

一,HASH模块

  下面举例说明了SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5算法的运算:

import hashlib

m = hashlib.md5()
print("m:",m)
# m: <md5 HASH object @ 0x00000224BA2D0378>
m1 = m.update(b"Hello")
print("m1:",m1)
print("m:",m)
# m1: None
# m: <md5 HASH object @ 0x00000224BA2D0378>
m2 = m.update(b"It's me")
print("m2:",m2)
print("m:",m)
# m2: None
# m: <md5 HASH object @ 0x00000224BA2D0378>
print(m.digest())
# b']\xde\xb4{/\x92Z\xd0\xbf$\x9cR\xe3Br\x8a'
m3 = m.update(b"It's been a long time since last time we ...")
print("m3:",m3)
print("m:",m)
# m3: None
# m: <md5 HASH object @ 0x00000224BA2D0378>
print(m.digest()) #2进制格式hash
print(len(m.hexdigest())) #16进制格式hash
# b'\xa0\xe9\x89E\x03\xcb\x9f\x1a\x14\xaa\x07?<\xae\xfa\xa5'
# 32
'''
def digest(self, *args, **kwargs): # real signature unknown
    """ Return the digest value as a string of binary data. """
    pass

def hexdigest(self, *args, **kwargs): # real signature unknown
    """ Return the digest value as a string of hexadecimal digits. """
    pass

  

import hashlib

######## md5 ########

res = hashlib.md5()
print("md5",res)
# md5 <md5 HASH object @ 0x00000203F6610378>
res1 = res.update(b'admin')
print("md5_update:",res1)
print("md5",res)
# md5_update: None
# md5 <md5 HASH object @ 0x00000203F6610378>
print(res.hexdigest())
# 21232f297a57a5a743894a0e4a801fc3

######## sha1 ########

hash = hashlib.sha1()
print("sha1",hash)
# sha1 <sha1 HASH object @ 0x0000024CA2840378>
hash1 = hash.update(b'admin')
print("hash1:",hash1)
print("hash:",hash)
# hash1: None
# hash: <sha1 HASH object @ 0x0000024CA2840378>
print(hash.hexdigest())
# d033e22ae348aeb5660fc2140aec35850c4da997

######## sha256 ########

hash = hashlib.sha256()
print("hash",hash)
# hash <sha256 HASH object @ 0x000001D462B20378>
hash1 = hash.update(b'admin')
print("sha256:",hash1)
print("hash:",hash)
# sha256: None
# hash: <sha256 HASH object @ 0x000001D462B20378>
print(hash.hexdigest())
# 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918

######## sha384 ########

hash = hashlib.sha384()
print("hash:",hash)
# hash: <sha384 HASH object @ 0x000001D82F940378>
hash1 =hash.update(b'admin')
print("sha384:",hash1)
print("hash:",hash)
# sha384: None
# hash: <sha384 HASH object @ 0x000001D82F940378>
print(hash.hexdigest())
# 9ca694a90285c034432c9550421b7b9dbd5c0f4b6673f05f6dbce58052ba20e4248041956ee8c9a2ec9f10290cdc0782

二,random模块

下面直接上代码,明白的快

import random

res1 = random.randrange(1,10) #返回1-10之间的一个随机数,不包括10
print(res1)
#4
res2 = random.randint(1,10) #返回1-10之间的一个随机数,包括10
print(res2)
#6
res3 = random.randrange(0, 100, 2) #随机选取0到100间的偶数
print(res3)
#12
res4 = random.random()  #返回一个随机浮点数
print(res4)
# 0.31929002952597907
res5 = random.choice('abce3#$@1') #返回一个给定数据集合中的随机字符
print(res5)
# @
res6 = random.sample('abcdefghij',3)  #从多个字符中选取特定数量的字符
print(res6)
# ['j', 'h', 'a']

  程序中有很多地方需要用到随机字符,比如登录网站的随机验证码,通过random模块可以很容易生成随机字符串,举例如下:

#生成随机字符串
import string
import random
res = ''.join(random.sample(string.ascii_lowercase + string.digits, 6))
print(res)
# 3l82uv
#洗牌

num = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
res2 = random.shuffle(num)
print(num)
# [3, 9, 5, 8, 4, 6, 1, 0, 2, 7]

  

三,math模块

  在数学之中,除了加减乘除四则运算之外——还有其它更多的运算,比如乘方、开方、对数运算等等,要实现这些运算,需要用到 Python 中的一个模块:Math

  模块(module)是 Python 中非常重要的东西,你可以把它理解为 Python 的扩展工具。换言之,Python 默认情况下提供了一些可用的东西,但是这些默认情况下提供的还远远不能满足编程实践的需要,于是就有人专门制作了另外一些工具。这些工具被称之为“模块”

  任何一个 Pythoner 都可以编写模块,并且把这些模块放到网上供他人来使用。

  当安装好 Python 之后,就有一些模块默认安装了,这个称之为“标准库”,“标准库”中的模块不需要安装,就可以直接使用。

  如果没有纳入标准库的模块,需要安装之后才能使用。模块的安装方法,我特别推荐使用 pip 来安装。这里仅仅提一下,后面会专门进行讲述,性急的看官可以自己 google。

  math模块是标准库里面的,所以不用安装,可以直接调用

# _*_ coding: utf-8 _*_
#导入模块
import math

#dir(module)是一个非常有用的指令,可以通过他来差任何模块所包含的工具
res = dir(math)
print(res)
# ['__doc__', '__loader__', '__name__', '__package__', '__spec__',
#  'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil',
#  'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1',
#  'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd',
#  'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma',
#  'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians',
#  'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
'''
    上面列举了math的所有方法,如果不会使用,
    请输入help(math.方法名)
'''
# help(math.pow)
# Help on built - in function pow in module math:
#
# pow(...)
#     pow(x, y)
#
#     Return x ** y(x to the power of y).
print(math.pi)
# 3.141592653589793

  

python 想搞加密算法吗?快戳这里的更多相关文章

  1. python爬虫16 | 你,快去试试用多进程的方式重新去爬取豆瓣上的电影

    我们在之前的文章谈到了高效爬虫 在 python 中 多线程下的 GIL 锁会让多线程显得有点鸡肋 特别是在 CPU 密集型的代码下 多线程被 GIL 锁搞得效率不高 特别是对于多核的 CPU 来说 ...

  2. 手把手教你使用Python轻松搞定发邮件

    前言 现在生活节奏加快,人们之间交流方式也有了天差地别,为了更加便捷的交流沟通,电子邮件产生了,众所周知,电子邮件其实就是客户端和服务器端发送接受数据一样,他有一个发信和一个收信的功能,电子邮件的通信 ...

  3. 之前想搞一个nim但因为是自用我会持续修复完善

    异步方式的优点:客户端和服务端互相解耦,双方可以不产生依赖.缺点是:由于引入了消息中间件,在编程的时候会增加难度系数.此外,消息中间件的可靠性.容错性.健壮性往往成为这类架构的决定性因素. 幸运的是程 ...

  4. 使用python来搞定redis的订阅功能

    好久没写博客了.   最近公司开了新项目,我负责的内容之一是系统的后端.具体项目内容我就不介绍了,但是用到的技术有些还是很有趣的,值得记录一下.今天介绍的就是其中一个:利用redis的pubsub订阅 ...

  5. 用Python来搞副业?这届大学生到底有多野……

    最近,我在知乎上偶然发现一个有意思的问题: 「大学生实习被当作廉价劳动力,你怎么看?」 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很 ...

  6. 就想搞明白,component-scan 是怎么把Bean都注册到Spring容器的!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 忒复杂,没等搞明白大促都过去了! 你经历过618和双11吗?你加入过大促时候那么多复 ...

  7. 20 行代码:Serverless 架构下用 Python 轻松搞定图像分类和预测

    作者 | 江昱 前言 图像分类是人工智能领域的一个热门话题.通俗解释就是,根据各自在图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法. 它利用计算机对图像进行定量分析,把图像或图像中 ...

  8. 想学设计模式、想搞架构设计,先学学UML系统建模吧您

    UML系统建模 1 概述 1.1 课程概述 汇集UML及其相关的一些话题 回顾UML相关的符号与概念 以电商订单相关业务为例,借助UML完成系统建模 将UML变成提升建模效率,表达架构思想的工具 1. ...

  9. Python实现循环的最快方式,for和while到底谁更强

    写在前面的一些P话: 大家都知道,效率不管是对于工作还是学习都是十分重要的.当然,Python也是需要效率的.众所周知,Python 不是一种执行效率较高的语言.此外在任何语言中,循环都是一种非常消耗 ...

随机推荐

  1. es6变量声明和解构赋值

    /*声明: * 本文内容多为学习借鉴性内容,大部分非原创 * 特别感谢阮一峰的 ECMAScript6 入门,推荐大家学习 */ 一.es5变量声明的不足 1.变量提升和函数声明提升 es5的代码加载 ...

  2. Python常用数据结构之collections模块

    Python数据结构常用模块:collections.heapq.operator.itertools collections collections是日常工作中的重点.高频模块,常用类型由: 计数器 ...

  3. PHP对象和接口抽象类注意事项

    Php 的对象的实现: 注:对象名称最好以对象名.class.php来进行命名. 1. 对于静态类的成员不能使用$this->这个来调用其静态类的成员和函数,应该使用self::成员或者方法来进 ...

  4. 机器学习之支持向量机(四):支持向量机的Python语言实现

    注:关于支持向量机系列文章是借鉴大神的神作,加以自己的理解写成的:若对原作者有损请告知,我会及时处理.转载请标明来源. 序: 我在支持向量机系列中主要讲支持向量机的公式推导,第一部分讲到推出拉格朗日对 ...

  5. java3 - 流程控制

    一.Java 有三种主要的循环结构: 需求:分别使用三种循环将 1 到 100 的整数输出到控制台. 1.for 循环 for(初始化语句; 布尔表达式语句; 更新语句) { //循环体内容 } 示列 ...

  6. Git版本控制的基本命令

    安装完了GIT首先要自报家门,否则代码不能提交 git config --global user.name "Your Name" git config --global user ...

  7. 未找到与命令“dotnet-ef”匹配的可执行文件

    在命令行里面执行操作的时候,报错了,网上找了一下原因 在报错的类库里面的xxx.csproj文件里面的ItemGroup里面加上一句 <DotNetCliToolReference Includ ...

  8. 《设计模式之禅》--设计模式大PK

    创建类模式包括工厂方法模式.建造者模式.抽象工厂模式.单例模式和原型模式. 其中单例模式要保持在内存中只有一个对象,原型模式是要求通过复制的方式产生一个新的对象. [工厂方法(抽象工厂) VS 建造者 ...

  9. 《android开发进阶从小工到专家》读书笔记--网络框架的设计与实现

    第一步: 第一层:Request--请求类型,JSON,字符串,文件 第二层:消息队列--维护了提交给网络框架的请求列表,并且根据响应的规则进行排序.默认情况下按照优先级和进入队列的顺序来执行,该队列 ...

  10. UVa230 Borrowers

    原题链接 UVa230 思路 这题输入时有一些字符串处理操作,可以利用string的substr()函数和find_last_of()函数更加方便,处理时不必更要把书名和作者对应下来,注意到原题书名的 ...