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的更多相关文章

  1. Python中模块之hashlib&hmac的讲解

    hashlib & hmac的讲解 两个模块主要用于加密相关的操作. 1. hashlib模块 md5 具体代码如下 import hashlib ha_m5 = hashlib.md5()# ...

  2. python全栈开发-hashlib模块(数据加密)、suprocess模块、xml模块

    一.hashlib模块 1.什么叫hash:hash是一种算法(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 ...

  3. bt 介绍以及 bt 种子的hash值(特征值)计算

    bt种子的hansh值计算,近期忽然对bt种子感兴趣了(原因勿问) 1. bt种子(概念) bt 是一个分布式文件分发协议,每一个文件下载者在下载的同一时候向其他下载者不断的上传已经下载的数据,这样保 ...

  4. python 通过文件路径获取文件hash值

    import hashlib import os,sys def CalcSha1(filepath): with open(filepath,'rb') as f: sha1obj = hashli ...

  5. Python——常用模块(time/datetime, random, os, shutil, json/pickcle, collections, hashlib/hmac, contextlib)

    1.time/datetime 这两个模块是与时间相关的模块,Python中通常用三种方式表示时间: #时间戳(timestamp):表示的是从1970年1月1日00:00:00开始按秒计算的偏移量. ...

  6. python hash 哈希值

    自增知识点 1,哈希 什么是可哈希(hashable)? 简要的说可哈希的数据类型,即不可变的数据结构(字符串str.元组tuple.对象集objects). 哈希有啥作用? 它是一个将大体量数据转化 ...

  7. JAVA-读取文件部分内容计算HASH值

    对于一些大文件,有时会需要计算部分内容的Hash,下面的函数计算了 文件头尾各1M,中间跳跃100M取10K 以及文件大小的Hash值 public static String CalHash(Str ...

  8. 【转】Java计算文件的hash值

    原文地址:http://blog.csdn.net/qq_25646191/article/details/78863110 如何知道一个文件是否改变了呢?当然是用比较文件hash值的方法,文件has ...

  9. C#实现像Git那样计算Hash值

    从Git Tip of the Week: Objects一文中得知,Git是这样计算提交内容的Hash值的: Hash算法用的是SHA1 计算前,会在内容前面添加"blob 内容长度\0& ...

随机推荐

  1. Android设置View抖动动画

    在应用中,有时候我们要吸引用户去点击某些按钮,比如应用市场的推荐按钮,为了能够吸引用户主动点击而且不过分的打扰用户,最好的方法就是给我们想吸引用户注意的view添加一些抖动动画,比如这张图 这里我主要 ...

  2. Fresco-FaceBook推出的Android图片加载库

    在Android设备上面,快速高效的显示图片是极为重要的.过去的几年里,我们在如何高效的存储图像这方面遇到了很多问题.图片太大,但是手机的内存却很小.每一个像素的R.G.B和alpha通道总共要占用4 ...

  3. PHP openssl函数库

    php openssl 函数库中.提供了大量的函数.但是我们一般用的最多的,就是 openssl_encrypt string openssl_encrypt ( string $data , str ...

  4. Java循环和条件

    下列程序的输出结果是什么? 1.Java循环和条件 /** * @Title:IuputData.java * @Package:com.you.data * @Description:TODO * ...

  5. Caused by: java.lang.NoClassDefFoundError: org/springframework/web/context/WebApplicationContext

    1.错误描述 严重: A child container failed during start java.util.concurrent.ExecutionException: org.apache ...

  6. Hibernate【映射】知识要点

    前言 前面的我们使用的是一个表的操作,但我们实际的开发中不可能只使用一个表的...因此,本博文主要讲解关联映射 集合映射 需求分析:当用户购买商品,用户可能有多个地址. 数据库表 我们一般如下图一样设 ...

  7. mybatis中动态update中的isNotEmpty和isNotNull标签

    一,简介 在iBATIS中isNull用于判断参数是否为Null,isNotNull相反isEmpty判断参数是否为Null或者空,满足其中一个条件则其trueisNotEmpty相反,当参数既不为N ...

  8. js中的回调函数的理解

    一,常见的但是不是特别注意的回调方法. 1.1,ajax $.ajax({ url:"test.json", type: "GET", data: {usern ...

  9. MyEclipse开发平台下如何将新建的JSP页面的默认编码格式设置为UTF-8--JSP

    新建的JSP页面原始的编码格式是ISO-8859-1(测试的MyEclipse版本为2014),它是不支持中文,在预览JSP页面时会出现乱码的现象.当然自己手动改一下编码格式就好了,但是那太过麻烦,每 ...

  10. C#多线程编程(2)-- async,await基本用法

    上一章我简单介绍了异步编程的基本方法,推荐使用的方式是Task.Task是对线程池的封装,并且可以对Task使用async和await关键字.这两个关键字的使用非常简单,那么这两个关键字究竟起什么作用 ...