数据加密:

  • 对称加密:数据加密和解密使用相同的密钥,主要解决数据的机密性(DES,AES)
  • 非对称加密(公匙加密):数据加密和解密使用的不同密钥,主要用于身份的验证(DSA,RSA)
  • 单向加密:只能加密不能解密,主要用于解决数据的完整性(MD5,SHA系列算法)

Python内置加密模块:

hashlib 主要提供了一些常见的单向加密算法(如MD5,SHA等)
hmac 单向加密算法,支持设置一个额外的密匙(salt)来提高安全性
secrets Python3.6新增用于获取安全随机数

1.hashlib 模块

  其中主要包含了MD5和SHA模块的功能,还提供了如MD5,SHA1,SHA224,SHA256,SHA384和SHA512(输出长度不同)等算法的函数实现

hashlib模块包含的函数与属性:

hashlib.new(name[,data]) 用于构造指定的哈希算法所对应的哈希对象,name可用于指定哈希算法的名称,如‘MD5’,‘sha1’,不分大小写,data为一个可选参数
hashlib.algorithms_guaranteed 它的值是一个该模块在所有平台都会支持的哈希算法的名称集合:set(['sha1','sha224','sha384','sha256','sha512','md5'])
hashlib.algorithms_available 它的值是一个当前运行的Python解释器中可用的哈希算法的名称集合,algorithms_guaranteed将永远是它的子集

hash对象包含的方法与属性:

hash.update() 更新哈希对象所要计算的数据,多次调用为累加效果,如m.update(a);m.update(b)等价于m.update(a+b)
hash.digest() 以二进制格式返回传递给update()函数的所有数据的摘要信息(字符串)
hash.hexdigest() 以十六进制格式返回传递给update()函数的所有数据的摘要信息(字符串)
hash.copy() 可用来有效计算共享一个初始子串的数据的摘要信息
hash.digest_size hash结果的字节大小,即hash.digest()方法返回结果的字符串长度,MD5:16,sha1:20,sha224:28
hash.block_size hash算法内部块的字节大小
hash.name 当前hash对象对应的哈希算法的标准名称(小写形式),可以直接传递hashlib.new()函数来创建另外一个同类型的哈希对象

实例:

import hashlib

hash  = hashlib.md5()
hash.update(b'Hello, ')
hash.update(b'World!')
ret1 = hash.digest() # 以二进制格式返回数据的加密信息
print(type(ret1), len(ret1), ret1)
ret2 = hash.hexdigest() # 以十六进制返回加密的数据值
print(type(ret2), len(ret2), ret2)

important

<class 'bytes'> 16 b'e\xa8\xe2}\x88y(81\xb6d\xbd\x8b\x7f\n\xd4'
<class 'str'> 32 65a8e27d8879283831b664bd8b7f0ad4

result

注: 只要输入的内容和加密模式相同,则输出的密匙就相同

2.hmac模块

  实现了HAMC算法,与hashlib提供的API基本一致

hamc模块提供的函数:

hamc.new(key,msg=None,digestmod=None) 用于创建一个hmac对象,key为密钥,msg为初始数据,digestmod为所使用的哈希算法,默认为hashlib.md5
hmac.compare_digest(a,b) 比较两个hmac对象,返回的是a==b的值

hamc对象中提供的方法与属性 与 hash对象中一致

实例:

import hmac

h1 = hmac.new(b'yeah', b'a', digestmod=hashlib.sha224)     # digestmod 默认为MD5
h1.update(b'hello')
ret1 = h1.digest() # 二进制
ret2 = h1.hexdigest() # 十六进制
print(type(ret1), ret1)
print(type(ret2), ret2) h2 = hmac.new(b'yeah', b'name')
ret3 = h2.hexdigest()
c = hmac.compare_digest(ret2, ret3) # 比较同类型进制的值
print(c)

improtant

<class 'bytes'> b'&\x9a\xd0{\x15WTE9@\xd9\xe3z\xfb+\\o\xc5\x88\x7f\x1c\xa4Q\xaf\x0c\n\xa8E'
<class 'str'> 269ad07b155754453940d9e37afb2b5c6fc5887f1ca451af0c0aa845
False

result

3.secrets模块

  生成用于管理密码、账户验证信息、安全令牌和相关秘密信息等数据的密码强随机数

secrets模块的两种操作:

  • 生成安全随机数
  • 生成一个笃定长度的随机字符串(可用作令牌和安全URL)

secrets模块提供的函数:

secrets.choice(sequence) 从指定的非空序列中随机选择一个元素并返回
secrets.randbelow(n) 从半开区间[0,n]内随机返回一个整数
secrets.randbits(k) 返回一个带有k个随机位的整数
secrets.token_bytes(nbytes=None) 返回一个包含nbytes个字节的随机字符串
secrets.token_hex(nbytes=None) 返回一个包含nbytes字节的16进制格式的随机文本字符串,可以用来生成一个随机密码
secrets.token_urlsafe([nbytes]) 返回一个包含nbytes个字节的随机安全URL文本字符串,可以在提供重置密码的应用中用来生成一个临时的随机令牌
secrets.compare_digest(a,b) 比较a,b字符串是否相等,若相等,返回True

实例:

import secrets
a = range(0, 99)
s = secrets.choice(a)
b = secrets.randbelow(77)
print(s)
print(b)
print(secrets.randbits(k=6))
print(secrets.token_bytes(nbytes=2))
print(secrets.token_hex(nbytes=2))
print(secrets.token_urlsafe(2))
print(secrets.compare_digest('a', 'b')) # 比较’字符串’

important

54
32
48
b'op'
b248
LNI
False

result

参考笔记:https://www.cnblogs.com/yyds/p/7072492.html

Python_python内置加密模块的更多相关文章

  1. 第5课:内置函数、处理json、常用模块

    1. 内置函数 1)常用的内置函数 print(all([0, 2, 3, 4])) # False,判断可迭代的对象里面的值是否都为真 print(any([0, 1, 2, 3, 4])) # T ...

  2. TODO:Laravel 内置简单登录

    TODO:Laravel 内置简单登录 1. 激活Laravel的Auth系统Laravel 利用 PHP 的新特性 trait 内置了非常完善好用的简单用户登录注册功能,适合一些不需要复杂用户权限管 ...

  3. python黑魔法 -- 内置方法使用

    很多pythonic的代码都会用到内置方法,根据自己的经验,罗列一下自己知道的内置方法. __getitem__ __setitem__ __delitem__ 这三个方法是字典类的内置方法,分别对应 ...

  4. Entity Framework 6 Recipes 2nd Edition(11-12)译 -> 定义内置函数

    11-12. 定义内置函数 问题 想要定义一个在eSQL 和LINQ 查询里使用的内置函数. 解决方案 我们要在数据库中使用IsNull 函数,但是EF没有为eSQL 或LINQ发布这个函数. 假设我 ...

  5. 在DevExpress程序中使用内置的图标构建美观的界面元素

    在我们一般的程序中,为一般的界面元素添加一定的图标展示,有助于提升界面的整体的美观.结合排版布局,以及固定场景的图标,往往给用户非常好的直观感受:统一.美观.易理解.因此在一般的程序界面中,都尽量在略 ...

  6. Java第三方数据库连接池库-DBCP-C3P0-Tomcat内置连接池

    连接池原理 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”.预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去.我们可以通过设定连接池 ...

  7. java web学习总结(二十五) -------------------JSP中的九个内置对象

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  8. javaScript的内置对象

    javaScript 有11种内置对象: Array . String .Date .Math . Boolean .Number . Function .Global .Error . RegExp ...

  9. ASP.NET的六大内置对象

    ASP.NET 六大内置对象(System.Web.UI.Page类): 1.Response 2.Request 3.Server 4.Application 5.Session 6.Cooki R ...

随机推荐

  1. ubuntu 安装source insight3.5

    版本 ubuntu 16.04 在linux下安装 windows下程序,需要安装wine, wine 是 "“Wine Is Not an Emulator" 缩写. 1) 安装 ...

  2. mysql的csv数据导入与导出

    # 需要station_realtime存在 load data infile 'd:/xxxx/station_realtime2013_01.csv' into table `station_re ...

  3. 如何:配置 ClickOnce 信任提示行为

    转载链接:https://technet.microsoft.com/zh-cn/magazine/ee308453 可以配置 ClickOnce 信任提示以控制是否允许最终用户选择安装 ClickO ...

  4. 小甜点,RecyclerView 之 ItemDecoration 讲解及高级特性实践

    本篇文章摘自微信公众号 guolin_blog (郭霖)独家发布 毫无疑问,RecyclerView 是现在 Android 世界中最重要的系统组件之一,它的出现就是为了高效代替 ListView 和 ...

  5. CentOS 7 服务器之间ssh无密码登录、传输文件

    在Linux服务器之间使用ssh命令向另一个Linux服务器发送执行指令是需要输入密码     ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一 ...

  6. 死磕安卓前序:MVP架构探究之旅—基础篇

    前言 了解相关更多技术,可参考<我就死磕安卓了,怎么了?>,接下来谈一谈我们来学习一下MVP的基本认识. 大家对MVC的架构模式再熟悉不过.今天我们就学习一下MVP架构模式. MVC和MV ...

  7. swift 实践- 04 -- UIButton

    import UIKit class ViewController: UIViewController { // 按钮的创建 // UIButtonType.system: 前面不带图标, 默认文字为 ...

  8. Oracle 之 外部表

    一.外部表概述 外部表只能在Oracle 9i 之后来使用.简单地说,外部表,是指不存在于数据库中的表. 通过向Oracle 提供描述外部表的元数据,我们可以把一个操作系统文件当成一个只读的数 据库表 ...

  9. Confluence 6 审查日志的对象

    审查日志记录一下事件的信息,这个记录不是详细的信息列表.但是这些信息能够让你了解你能够在日志中看到些什么内容. 空间 创建和删除一个空间. 编辑空间细节,主题,配色方案或者样式表. 修改空间权限,包括 ...

  10. Confluence 6 从生产环境中恢复一个测试实例

    请参考 Restoring a Test Instance from Production 页面中的内容获得更多完整的说明. 很多 Confluence 的管理员将会使用生产实例运行完整数据和服务的 ...