关于hashlib哈希算法的一些个人笔记

关于hashlib哈希算法的一些个人笔记摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。hashlib提供了常见的摘要算法,具体包括md5、sha1、sha224、sha256、sha512等,我们一般用的比较多是md5。注意加密是单向的。通过hashlib,可以把任意长度的字符串转换成固定长度的加密串,通常我们一般用hexdigest(),也就是…

大家好,又见面了,我是你们的朋友全栈君。

摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
hashlib提供了常见的摘要算法,具体包括md5、sha1、sha224、sha256、sha512等,我们一般用的比较多是md5。注意加密是单向的。

通过hashlib,可以把任意长度的字符串转换成固定长度的加密串,通常我们一般用hexdigest(),也就是十六进制数据字符串的值来表示。
下面是一段简单的代码示例:

import hashlib

def md5(str):
    md5 = hashlib.md5()
    md5.update(str)
    ##return md5.digest() # 返回摘要,作为二进制数据字符串值
    return md5.hexdigest()   # 返回摘要,作为十六进制数据字符串值

if __name__ == "__main__":
    str = "abcdefg"
    str = str.encode("utf8") # 
    print(md5(str))

返回一个十六进制的固定长度字符串,结果如下:

e2fc714c4727ee9395f324cd2e7f331f

如果用的是digest(),则会返回一个二进制的,结果如下:

b"\xe2\xfcqLG'\xee\x93\x95\xf3$\xcd.\x7f3\x1f"

如果我们改变str中的任意字符,结果会发生很大的变化。

注意一点:python3中,字符串默认的都是unicode,所以需要先encode到utf8,否则会报错类似于下面这个错误:

Unicode-objects must be encoded before hashing

由于是单向加密,通常可以用来保存一些内部信息到数据库中,比如用户名密码这一类。因为是单向的,所以不能用于加密解密,只适合于防篡改,或者验证用户密码等。

我们也可以通过把登录名作为Salt的一部分来计算MD5,这样不容易被其他人通过MD5反推明文口令:

def get_md5(user, passwd):
    if isinstance(url, str):
        url = url.encode("utf8")
    m = hashlib.md5()
    m.update(user + passwd)
    return m.hexdigest()


if __name__ == "__main__":
    user = "root"
    passwd = "password"
    print(get_md5(user, passwd))

注意中间我加了if判断,以便于做unicode的转换。在python3中,已经没有unicode这种类型,str就是unicode。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136692.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm上传代码到gitlab_可以在gitlab里查看代码

    pycharm上传代码到gitlab_可以在gitlab里查看代码1.Pycharm关联Git安装路径(1)确定自己已经安装git,并且知晓git安装目录,我这里git安装在D盘目录下。(2)打开pycharm—->File——>Settings【点击Test后,出现弹框5,点击OK,此时Pycharm已关联git路径成功。】2.pycharm从gitlab上拉取代码(1)依次点击下图中…

    2022年8月28日
  • SpringBoot线程池的创建、@Async配置步骤及注意事项

    SpringBoot线程池的创建、@Async配置步骤及注意事项前言:最近在做订单模块,用户购买服务类产品之后,需要进行预约,预约成功之后分别给商家和用户发送提醒短信。考虑发短信耗时的情况所以我想用异步的方法去执行,于是就在网上看见了Spring的@Async了。但是遇到了许多问题,使得@Async无效,也一直没有找到很好的文章去详细的说明@Async的正确及错误的使用方法及需要注意的地方,这里简单整理了一下遇见的问题,Sring是以配置文件的形式来开启…

    2022年6月24日
  • Map嵌套Map遍历[通俗易懂]

    Map嵌套Map遍历[通俗易懂]废话不多说,直接上代码块!importjava.util.HashMap;importjava.util.Map;/***Map集合嵌套Map集合遍历*Createdbyaongion2017/4/28.*Version1.0*/publicclassMapOf{publicstaticvoidbl(HashMap

    2022年9月16日
  • 在c语言里0和1表示什么_’0’是什么意思c语言

    在c语言里0和1表示什么_’0’是什么意思c语言C语言中常见~Number,怎么计算?计算一个数字的~number比如说现在有A=60那么A的8位二进制数就是00111100那首先要计算~A即~60,那么先取反即11000011。因为负数的补码是取反+1。所以此处逆向操作需要-1取反即11000011-1==11000010(第一步逆向操作)11000010=>取反=>00111101=>十进制的61最后结果A==60,~A=-61C

    2022年9月20日
  • 数论的概念_数论难吗

    数论的概念_数论难吗转载自:https://blog.csdn.net/whereisherofrom/article/details/78922798素数:http://www.cnblogs.com/fzl194/

    2022年8月2日
  • ResNet解析_restnet

    ResNet解析_restnetResNet在2015年被提出,在ImageNet比赛classification任务上获得第一名,因为它“简单与实用”并存,之后很多方法都建立在ResNet50或者ResNet101的基础上完成的,检测,分割,识别等领域都纷纷使用ResNet,Alphazero也使用了ResNet,所以可见ResNet确实很好用。下面我们从实用的角度去看看ResNet。1.ResNet意义随着…

    2022年10月7日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号