【Python】 hash值计算 hashlib & hmac
hashlib & hmac
*不是很清楚能不能把这种hash值取样算法称之为加密,但是似乎好像也是这么说的哈(非科班出身的野路子就是没这种基本知识的)
■ 基本用法
hashlib支持MD5,sha1等多种加密算法,详见hashlib.algorithms_available
用法十分简单:
m = hashlib.md5() #或者是其他算法的名字,如hashlib.sha1()
m.update("Some String") #加密用update方法,注意这个方法不会返回任何值,而是把加密解密操作封装在了m这个对象里面 print m.hexdigest() #一般查看加密后的密文用hexdigest方法
*关于update方法,还有一点要说。update("a")之后再update("b")并不是说把原先a的部分都抹掉再“更新”成b(which是update这个词本身的意思吧。。),而是相当于从最开始就update("ab")了。
hmac模块用法基本同上,但是在创建加密对象的时候需要传递一个key进去:
m = hmac.new("myownkey") #默认的加密算法是md5,如果需要用其他的算法,可以用digestmod参数,令其digestmod=hashlib.sha1
m.update("Some String")
m.hexdigest() #显示加密后的密文
*m也可调用m.digest()方法,得到的是密文的“字符串形式二进制数据”。而上面提到的hexdigest方法只不过是把digest方法得到的密文通过hex编码生成了结果。相当于:
m.digest().encode("hex") 就是得到的 m.hexdigest()
同hex类似的另一种编码方式便是base64了。即m.digest().encode("base64")可以生成以base64格式编码的内容了?
**虽然同为编码方式,hex以及base64和之前我熟悉的utf-8,gbk,ascii这些编码不是一个概念。
utf-8,ascii这些编码主要用于将二进制数据和中文等自然语言的互相转换制定了一个标准
base64,hex这些则是制定了二进制数据和可以拿来进行网络传输的数据之间的互相转换的标准(比如把图片的二进制数据通过base64编码成一个字符串,这样看到这个字符串的人是不知道原来的图片是长什么样子的) //这个只是我个人YY出来的,下次有时间了仔细再去看一下详细解释,留个疑问吧
***話が変わるけど,这个hash值取出来之后应该首先是一串二进制数据对吧?然后再把这个数据通过某种编码方式编码之后,就是digest的产物了。也就是所谓的“字符串形式的二进制数据”。然后把这个字符串再通过hex或者base64的编码规则映射一下得到的就是最终的数据了。可以参考以下代码:
m = hashlib.md5()
m.update("Some String")
print type(m.digest())
print [m.digest()] #这里用列表而不是直接print是因为,print的话肯定会以某种默认的编码(或utf,或gbk,跟python shell的环境有关)显示出来,这样会乱码= =\
而列表在print的时候可以直接显示内存中的内容。
print m.digest().encode("hex")
print m.digest().encode("base64") ################输出################
<type 'str'>
['\x83\xbe\xb8\xc4\xfaE\x96\xc8\xf7\xb5e\xd3\x90\xf4\x94\xe2']
83beb8c4fa4596c8f7b565d390f494e2
g764xPpFlsj3tWXTkPSU4g==
■ 关于linux的md5sum命令和python的hashlib
偶尔发现md5sum读取文件的MD5哈希值和通过python的hashlib算出来的不一致。这主要是换行符的锅。或者说,在windows上进行python的hashlib读取文件哈希值算出来的和在linux上算出来的不一样的。解决的办法就是在windows上使用update之前,保证被读入md5对象的值是通过rb模式打开文件读取到的内容:
import hashlib
m = md5()
with open('testfile','rb') as f:
content = f.read()
m.update(content)
print m.hexdigest()
【Python】 hash值计算 hashlib & hmac的更多相关文章
- Python中模块之hashlib&hmac的讲解
hashlib & hmac的讲解 两个模块主要用于加密相关的操作. 1. hashlib模块 md5 具体代码如下 import hashlib ha_m5 = hashlib.md5()# ...
- python全栈开发-hashlib模块(数据加密)、suprocess模块、xml模块
一.hashlib模块 1.什么叫hash:hash是一种算法(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 ...
- bt 介绍以及 bt 种子的hash值(特征值)计算
bt种子的hansh值计算,近期忽然对bt种子感兴趣了(原因勿问) 1. bt种子(概念) bt 是一个分布式文件分发协议,每一个文件下载者在下载的同一时候向其他下载者不断的上传已经下载的数据,这样保 ...
- python 通过文件路径获取文件hash值
import hashlib import os,sys def CalcSha1(filepath): with open(filepath,'rb') as f: sha1obj = hashli ...
- Python——常用模块(time/datetime, random, os, shutil, json/pickcle, collections, hashlib/hmac, contextlib)
1.time/datetime 这两个模块是与时间相关的模块,Python中通常用三种方式表示时间: #时间戳(timestamp):表示的是从1970年1月1日00:00:00开始按秒计算的偏移量. ...
- python hash 哈希值
自增知识点 1,哈希 什么是可哈希(hashable)? 简要的说可哈希的数据类型,即不可变的数据结构(字符串str.元组tuple.对象集objects). 哈希有啥作用? 它是一个将大体量数据转化 ...
- JAVA-读取文件部分内容计算HASH值
对于一些大文件,有时会需要计算部分内容的Hash,下面的函数计算了 文件头尾各1M,中间跳跃100M取10K 以及文件大小的Hash值 public static String CalHash(Str ...
- 【转】Java计算文件的hash值
原文地址:http://blog.csdn.net/qq_25646191/article/details/78863110 如何知道一个文件是否改变了呢?当然是用比较文件hash值的方法,文件has ...
- C#实现像Git那样计算Hash值
从Git Tip of the Week: Objects一文中得知,Git是这样计算提交内容的Hash值的: Hash算法用的是SHA1 计算前,会在内容前面添加"blob 内容长度\0& ...
随机推荐
- R学习笔记(4): 使用外部数据
来源于:R学习笔记(4): 使用外部数据 博客:心内求法 鉴于内存的非持久性和容量限制,一个有效的数据处理工具必须能够使用外部数据:能够从外部获取大量的数据,也能够将处理结果保存.R中提供了一系列的函 ...
- strcmp函数实现
/* 功能:比较字符串s1和s2大小. 一般形式:int strcmp(字符串1,字符串2) 说明: 当s1<s2时,返回-1 当s1=s2时,返回 0 当s1>s2时,返回 1 即两个字 ...
- 基于am3358的led跑马灯测试
#include <sys/ioctl.h> #include<stdio.h> #include <fcntl.h> #include <sys/types ...
- 版本控制工具--svn和git的使用(二) -----SVN的操作
SVN的使用 开头: 对于svn的详解,我不是很熟,只是用过svn的客户端,没使用过服务端,在这里我只是简单说一下在svn的客户端怎么拉取代码,提交代码和修改冲突等等.svn的客户端我在Mac中用的s ...
- JavaScript小括号、中括号、大括号的多义性
语义1,函数声明时参数表 func(arg1,arg2){ // ... } 语义2,和一些语句联合使用以达到某些限定作用 // 和for in一起使用 for(var a in obj){ // . ...
- js中的0就是false,非0就是true及案例
在处理js代码判断真假时经常会这么写. 但fun()可能得到的是数字0,这可不是表示的没有值,但是!js中的数字0就是false,非0就是true. 于是0就被无情的当做false了. 已经被这个坑过 ...
- 实例 find
2011/09/08 12:00 时间开始找一天內的,会列出 2011/09/07 12:00 ~ 2011/09/08 12:00 时间內的文件3天前被改动过的文件 (前第三天以前 → 2011/0 ...
- Servlet程序
编写: (1)搭建javaweb项目: 1,创建一个java项目:HelloServletWeb 2,在HelloServletWeb中创建一个文件夹webapp表示Web的根 3,在webapp中创 ...
- JVM学习笔记一:Java运行时数据区域
1. 程序计数器 当前线程所执行的字节码的行号指示器. 2. Java虚拟机栈 线程私有,与线程具有相同生命周期.用于存储局部变量表.操作数栈.动态链表.方法出口等信息. 局部变量表存放内容: 基本数 ...
- ubuntu安装Eclipse无图标(手动创建软件图标) —— 其他的软件也一样
//退回根目录 cd / //进入图标存放目录 cd usr/share/applications/ //用文本编辑器打开打开eclipse的图标文件,没有会自动创建 sudo gedit eclip ...