MD5不是加密

https://draveness.me/whys-the-design-password-with-md5/ 参考为什么这么设计

  • Message-Digest Algorithm 5:信息摘要算法

  • MD5 并不是一种加密算法,我们也可以叫它哈希函数

  • 世界上最常见的20个密码,类似建立一个彩虹表进行碰撞,以达到解密的效果。

    RANK 2021 MD5值(32位小写)
    1 123456 e10adc3949ba59abbe56e057f20f883e
    2 123456789 25f9e794323b453885f5181f1b624d0b
    3 12345 827ccb0eea8a706c4c34a16891f84e7b
    4 qwerty d8578edf8458ce06fbc5bb76a58c5ca4
    5 password 5f4dcc3b5aa765d61d8327deb882cf99
    6 12345678 25d55ad283aa400af464c76d713c07ad
    7 111111 96e79218965eb72c92a549dd5a330112
    8 123123 4297f44b13955235245b2497399d7a93
    9 1234567890 e807f1fcf82d132f9bb018ca6738a19f
    10 1234567 fcea920f7412b5da7be0cf42b8c93759
    11 qwerty123 3fc0a7acf087f549ac2b266baf94b8b1
    12 000000 670b14728ad9902aecba32e22fa4f6bd
    13 1q2w3e 3fde6bb0541387e4ebdadf7c2ff31123
    14 aa12345678 d4f2a60315eef2b600cf0240ac0c37ad
    15 abc123 e99a18c428cb38d5f260853678922e03
    16 password1 7c6a180b36896a0a8c02787eeafb0e4c
    17 1234 81dc9bdb52d04dc20036dbd8313ed055
    18 qwertyuiop 6eea9b7ef19179a06954edd0f6c05ceb
    19 123321 c8837b23ff8aaa8a2dde915473ce0991
    20 password123 482c811da5d5b4bc6d497ffa98491e38
  • 为什么说MD5不是加密呢?

    • 数据源是无穷尽的,而 MD5密文是有限的。所以不存在MD5解密。
    • MD5 哈希的信息无法被还原,只依靠 MD5 是无法完成加密的。
  • 哈希加盐salt

    • 在原始字符串的基础上增加一个字符串,得到一个新的"密码"。
    • /etc/passwd早期就是这么存储密码的
  • 密码的破解(哈希碰撞)

    • 攻击者其实不需要知道用户的密码是什么,他只需要找到一个值 value,这个值加盐后的哈希与密码加盐后的哈希完全一致就能登录用户的账号
    • 可以了解下hashcat(github搜)

Python中的MD5"加密"

  • 加密

    import hashlib
    ori_pwd = '123456'
    byte_ori_pwd = ori_pwd.encode('utf-8') #bytes对象
    print(hashlib.md5(byte_ori_pwd).hexdigest())
    #e10adc3949ba59abbe56e057f20f883e 都是这个
    print(hashlib.md5(b'123456').hexdigest())
  • 得到的是32位小写,如果要32位大写、16位大小写,那就简单处理下

    import hashlib
    ori_pwd = '123456'
    byte_ori_pwd = ori_pwd.encode('utf-8')
    print('32位小写: ',hashlib.md5(byte_ori_pwd).hexdigest())
    print('32位大写: ',hashlib.md5(byte_ori_pwd).hexdigest().upper())
    print('16位小写: ',hashlib.md5(byte_ori_pwd).hexdigest()[8:-8])
    print('16位大写: ',hashlib.md5(byte_ori_pwd).hexdigest()[8:-8].upper())
  • 加盐

    import hashlib
    def get_md5(ori_str:str,salt:str='',mode:str='1') -> str:
    """
    获取字符串的MD加密后的信息
    :param ori_str: 原始字符串
    :param salt: 盐值
    :param mode: 1=32小 2=32大 3=16小 4=16大
    :return: MD5后的字符串
    """
    md5_password = hashlib.md5((ori_str+salt).encode('utf-8')).hexdigest()
    if mode == '1':
    return md5_password
    if mode == '2':
    return md5_password.upper()
    if mode == '3':
    return md5_password[8:-8]
    if mode == '4':
    return md5_password[8:-8].upper()
    raise Exception(f'unsupport mode {mode},only support 1,2,3,4(1=32小 2=32大 3=16小 4=16大)')
    print('不加盐:',get_md5('123456'))
    print('加盐:',get_md5('123456',salt='nanjing'))
    print('不加盐:',get_md5('123456'))
    print('不加盐16位小写:',get_md5('123456',salt='nanjing',mode='3'))
    print('不加盐16位小写:',get_md5('123456',salt='nanjing',mode='5'))

MD5在Python中的简单使用的更多相关文章

  1. python中一个简单的webserver

     python中一个简单的webserver 2013-02-24 15:37:49 分类: Python/Ruby 支持多线程的webserver   1 2 3 4 5 6 7 8 9 10 11 ...

  2. Python 中lambda 简单介绍

    转自:https://www.cnblogs.com/AlwaysWIN/p/6202320.html 在学习python的过程中,lambda的语法经常出现,现在将它整理一下,以备日后查看. 1.l ...

  3. 正则表达式在python中的简单使用

    正则表达式独立与编程语言,基本上所有的编程语言都实现了正则表达式的相关操作.在Python中正则表达式的表现为re模块: import re 其操作有三个方法: my_string = "h ...

  4. Python中实现简单的插件框架

    在系统设计中,经常我们希望设计一套插件机制,在不修改程序主体情况下,动态去加载附能. 我设想的插件系统: 1.通过类来实现 2.自动查找和导入 我们假设需要实现一个简单的插件系统,插件可以接收一个参数 ...

  5. elasticsearch基础及在Python中的简单使用

    目录 一. 安装java环境与elasticsearch.kibana 二. elasticsearch.kibana的部分文件说明 三. Kibana的Dev tools中ES的简单命令 四. ES ...

  6. python中HTMLParser简单理解

    找一个网页,例如https://www.python.org/events/python-events/,用浏览器查看源码并复制,然后尝试解析一下HTML,输出Python官网发布的会议时间.名称和地 ...

  7. python中最简单的多进程程序

    学着.. #!/usr/bin/env python # -*- coding: utf-8 -*- # Spawn a Process: Chapter 3: Process Based Paral ...

  8. Python中最简单快捷的输出方式

    格式化输出最简单的方式之哑巴填充公式 name=ludundun age=25 print(f'hello {name},your age is {age}') 输出内容: hello ludundu ...

  9. python中property简单使用与实现

    property简单使用 class P: """ property简单使用 """ def __init__(self,name): se ...

  10. Python中的简单实现UDP协议没有粘包问题

    服务端: import socket server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #数据报协议->udp server.bind ...

随机推荐

  1. Vue3实现动态导入Excel表格数据

    1.  前言 在开发工作过程中,我们会遇到各种各样的表格数据导入,大部分我们的解决方案:提供一个模板前端进行下载,然后按照这个模板要求进行数据填充,最后上传导入,这是其中一种解决方案.个人认为还有另外 ...

  2. 【题解】CF1503B 3-Coloring

    题面传送门 解决思路 讲一下 \(\text{VP}\) 时的思路. 首先想到,只要能将棋盘中红色或蓝色部分全部填成同一个数,那么剩下的就不会受限了(可行有两个,限制只有一个): 但考虑到交互库可能有 ...

  3. 如何通过Java代码给Word文档添加水印?

    Word中可以为文档添加的水印分为两种形式:文字水印和图片水印.水印是一种数字保护的手段,在文档上添加水印可以传达有用信息,或者在不影响正文文字显示效果的同时,为打印文档增添视觉趣味,能起到传递信息, ...

  4. i春秋exec

    打开是一个gif,提示文字未登录 话不多说,查看源码 发现vim字样,可能是文件泄露 直接在url后加/.index.php.swp来下载泄露文件 下载好了之后放vm上使用vim -r  .index ...

  5. 简单的sql注入3

    仍然 1 1' 1" 发现1'报错了.....我觉得作者对'情有独钟 再试试 1# 1'# 1"# 发现都可以正常登录 试试1' and '1'='1和1' and '1'='2发 ...

  6. 小米路由器局域网设备ping不通

    问题 手机和电脑在同一个局域网内,都连接上小米路由器,我发现电脑部署的服务局域网设备都访问不到,甚至ping不到,排除了防火墙问题,最终发现是路由器一个设置导致的. 解决 将原来的混合加密,更换为强加 ...

  7. @responseBody 返回更多数据

    @responseBody:注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需 ...

  8. Golang反射获得变量类型和值

    1. 什么是反射 反射是程序在运行期间获取变量的类型和值.或者执行变量的方法的能力. Golang反射包中有两对非常重要的函数和类型,两个函数分别是: reflect.TypeOf 能获取类型信息re ...

  9. 零基础学习python的第一天整理——python的安装以及pycharm安装

    ​ 一.python的安装 首先我们来谈一谈python的安装,python的官网地址:Welcome to Python.org​编辑 进入官网后点击Downloads,然后选择自己对应的系统,比如 ...

  10. O-MVLL:支持ARM64的基于LLVM的代码混淆模块

    O-MVLL介绍 O-MVLL的开发灵感来自于另一个著名的基于LLVM的代码混淆项目ollvm,并在其基础上做了创新和改进.O-MVLL的混淆逻辑实现方式也是通过LLVM Pass,支持也仅会支持AR ...