MD5加密_md5长度-程序员宅基地

技术标签: java  网络安全  

MD5加密

MD5算法为计算机安全领域广泛使用的一种散列函数,用于提供消息的完整性,是计算机广泛使用的哈希算法之一

MD5的固定长度为128比特,16字节,通常用他的16进制字面值输出他,是一个长度为32位的字符串

MD5特点

  1. 长度固定(无论输入多少字节,输出总是16字节
  2. 不可逆(从结果无法反推原始数据
  3. 具有高度的离散性(输出的16字节数据,没有任何规律可言,无法预测结果)
  4. 抗碰撞性(在原始数据固定的情况下,几乎不会出现两个数据的MD5相同

MD5应用场景

  • 用户密码保护:在保存用户密码时,不记录密码本身,只记录密码的MD5结果(即使数据库被盗也无法反推出明文)
  • 文件完整性校验:先在发送端计算一次文件的MD5,并把结果发送给接收端,接收端在接受文件后也计算一次MD5,两次结果一致文件完整
  • 云盘秒传:云盘上传时计算MD5,并在自己的数据库中搜索一下 MD5是否存在,存在则使用已有的文件就可以了,从而实现云盘秒传。
  • 数字签名:发布程序时同时发布其MD5,下载后比较MD5是否相同,就可知道程序是否被篡改。

MD5算法实现

1.对输入内容进行补位

在这里插入图片描述

补位是对长度进行补齐的一种操作,是长度变成N*512+448比特

  1. 补齐的方法为先补一个1再补多个0
  2. 使总长度除以512余448
  3. 补位操作必须进行,如果原始长度满足也要补一个512位,使长度变为(N+1)*512+448
  4. 补位留448的原因是:剩下的64位(8个字节)需要记录数据的原始长度
  5. 上述步骤完成变为512的整数倍,**记为M 512,即M 64字节大小

在这里插入图片描述

2.准备了4个标准幻数

  • 每一个标准幻数都是4个字节,总计:4*4=16个字节
  • 程序中使用小端序列
  • 将最初的4个标准幻数与N*64字节数据进行计算
  • 第一次取标准幻数和一组64字节数据进行计算得到新的幻数
  • 新的幻数为下一轮参数与下一组64字节数据进行运算
  • 经过N轮得到的最终幻数依次输出,就得到了MD5加密结果

在这里插入图片描述

3.最终结果

将得到的四个最终幻数按照16进制按照顺序显示出来就是最终的MD5结果

在这里插入图片描述

MD5使用

Java使用MD5做用户密码保护

/**
 * MD5加密,得到32位字符串
 * @param strSrc
 * @return
 */
public static String encrypt(String strSrc) {
    
    try {
    
        char hexChars[] = {
     '0', '1', '2', '3', '4', '5', '6', '7', '8',
                '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        byte[] bytes = strSrc.getBytes();
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(bytes);
        bytes = md.digest();
        int j = bytes.length;
        char[] chars = new char[j * 2];
        int k = 0;
        for (int i = 0; i < bytes.length; i++) {
    
            byte b = bytes[i];
            chars[k++] = hexChars[b >>> 4 & 0xf];
            chars[k++] = hexChars[b & 0xf];
        }
        return new String(chars);
    } catch (NoSuchAlgorithmException e) {
    
        e.printStackTrace();
        throw new RuntimeException("MD5加密出错!!+" + e);
    }
}

/**
 * MD5加密,获得32位字符串(结果和上一个相同)
 * @param password
 * @return
 */
public static String getMD5(String password) {
    
    try {
    
        // 得到一个信息摘要器
        MessageDigest digest = MessageDigest.getInstance("md5");
        byte[] result = digest.digest(password.getBytes());
        StringBuffer buffer = new StringBuffer();
        // 把每一个byte 做一个与运算 0xff;
        for (byte b : result) {
    
            // 与运算
            int number = b & 0xff;// 加盐
            String str = Integer.toHexString(number);
            if (str.length() == 1) {
    
                buffer.append("0");
            }
            buffer.append(str);
        }

        // 标准的md5加密后的结果
        return buffer.toString();
    } catch (NoSuchAlgorithmException e) {
    
        e.printStackTrace();
        return "";
    }
}

public static void main(String[] args) {
    
    System.out.println(getMD5("123456"));
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_46582525/article/details/123757932

智能推荐

JAVA文本域组件_public js(){setbounds(100,100,400,400);-程序员宅基地

文章浏览阅读1.1k次。文本域(JTextArea)这一组件,在程序中接受用户的多行文字输入。Swing中任何一个文本区域都是JTextArea类型的对象。JTextArea常用的构造方法如下:1. public JTextArea().2. public JTextArea(String text).3. public JTextArea(int rows,int columns).4. public J..._public js(){setbounds(100,100,400,400);

基因表达式编程gep_最具潜力的编程语言GO有新书啦-程序员宅基地

文章浏览阅读261次。互联网时代的来临,改变甚至颠覆了很多东西。从前,一台主机就能搞定一切;而在互联网时代,后台由大量分布式系统构成,任何单个后台服务器节点的故障都不会影响整个系统的正常运行。以七牛云、阿里云和腾讯云为代表的云厂商的出现和崛起,标志着云时代的到来。在云时代,掌握分布式编程已经成为软件工程师的基本技能,而基于Go语言构建的Docker、Kubernetes等系统正是将云时代推向顶峰的关键力量。今天,Go语..._gepgo

android:layout_above="@id/xxx"  --将控件置于给定ID控件之上android:layout_below="@id/xxx"  -_android layout 在之上-程序员宅基地

文章浏览阅读2.3k次。Android中RelativeLayout各个属性 android:layout_above="@id/xxx" --将控件置于给定ID控件之上android:layout_below="@id/xxx" --将控件置于给定ID控件之下android:layout_toLeftOf="@id/xxx" --将控件的右边缘和给定ID控件的左边缘对齐andr_android layout 在之上

C++语法篇之 Templates 模板_c++ templates-程序员宅基地

文章浏览阅读1.5k次。假如我们需要设计X和Y两个列表,这两个列表具有相似的代码唯一的不同是数据类型,则在C++中实现有如下的选择:共同的基类:在大多数场景并不适用,只是为了一个列表去提炼基类也没必要。 克隆代码:分别对X 和 Y 类型定义各自的列表,能够保证类型安全但是后期维护成本高。 空列表:定义一个没有类型的列表 (void(*))。缺点是类型不安全。除此之外,我们还可以用Template来实现,Template 既能保证重用代码,还能保证类型安全。那我们就来看看Template是如何施展魔法的。Templa._c++ templates

用SublimeText3开发微信小程序时,如何让代码高亮显示_sumlime text 微信小程序代码高亮-程序员宅基地

文章浏览阅读497次。打开.wxml文件的时候,选择右下角的“Open all with current extension as…”,然后再从弹出的列表中选择“HTML”打开.wxss文件的时候,选择右下角的“Open all with current extension as…”,然后再从弹出的列表中选择“css”..._sumlime text 微信小程序代码高亮

php7链接mysql8报错SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES)_运行php项目sqlstate[hy000] [1045] access denied for us-程序员宅基地

文章浏览阅读7.1k次。使用环境:windows 7 下wampserver 3.2.0-64bitmysql版本8.0.18 端口号:3308php版本7.3.12测试的源码:<?php$servername = "localhost";$username = "root";$password = "root"; try { $conn = new PDO("mysql:host=..._运行php项目sqlstate[hy000] [1045] access denied for user ''@'localhost' (usi

随便推点

java请实现程序输出以下星塔||输出菱形_需要在 main 函数的输入参数中设置 5,输出 5 层星塔,如果是输入 7,则是 7 层星塔-程序员宅基地

文章浏览阅读1.3k次。java请实现程序输出以下星塔||输出菱形请实现程序输出以下星塔。 ************ *需要在main函数的输入参数中设置5,输出5层星塔。如果是输入7,则是7层星塔。假设输入参数都是奇数,且都大于等于5,小于等于11。第一种写法:/** * 请实现程序输出以下星塔 */import java.util.*;public class HomeWork02 { public static void main(..._需要在 main 函数的输入参数中设置 5,输出 5 层星塔,如果是输入 7,则是 7 层星塔

联网后只能登录QQ浏览器不能联网-程序员宅基地

文章浏览阅读382次,点赞9次,收藏5次。可以百度查一下,如广州DNS地址,填入,即可上网。更改DNS服务器地址,

用Maven构建Hadoop项目-程序员宅基地

文章浏览阅读444次。主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增加的项目包括,YARN, Hcatalog, Oozie, Cassandra, Hama, Whirr, Flume, Bigtop, Crunch, Hue等。从2011年开始,中国进入大数据风起云

Python中遍历同类型文件的方法!-程序员宅基地

文章浏览阅读133次。在Python中,想要遍历同类型的文件可使用的方法有很多,比如:使用OS模块、使用glob模块、使用pathlib模块等,接下来是具体方法介绍。可以使用os模块中的listdir方法获取文件夹下所有的文件和子文件夹。然后通过遍历获取到的文件和文件夹列表,筛选出符合条件的文件。glob模块可以根据指定的通配符搜索匹配的文件路径,这样可以更方便地获取指定类型的文件路径。Pathlib模块可以方便地进行文件路径的操作,包括遍历、过滤和获取文件类型等。3、使用Pathlib模块。2、使用glob模块。

android5.0以上实现录屏功能,并将录屏内容在相册中显示!(unity调用android方法)-程序员宅基地

文章浏览阅读5.6k次。package com.Xreal.TJYH;import android.Manifest;import android.content.ContentValues;import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager;import

WebPack-Loader-程序员宅基地

文章浏览阅读81次。WebPack-Loader Loaders鼎鼎大名的Loaders登场了!1、什么是loaders  Loaders是webpack中最让人激动人心的功能之一了。通过使用不同的loader,webpack通过调用外部的脚本或工具可以对各种各样的格式的文件进行处理,  比如说分析JSON文件并把它转换为JavaScript文件,或者..._webpack_loader怎么装

推荐文章

热门文章

相关标签