md5加密算法-程序员宅基地

技术标签: java基础  安全  

md5是什么?

md5是一种信息摘要算法(message-digest algorithm 5 ),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值,用来确保信息传输完整一致性。

特点

  • 不可逆

                知道密文和加密方式,无法反向计算出原密码

                但是有md5破解网站,专门查询MD5码

撞库:原理是:通过建立大型的数据库,把日常的各种句子通过md5加密成为密文,不断积累更新大量句子,放在庞大的数据库里;然后,有人拿了别人的密文,想查询真实的密码,就需要把密文拿到这个数据库的网站(免费MD5加密解密:https://md5.cn/)去查询。

  • 长度固定

        任意长度的数据,算出来的md5值长度都是固定的

  • 强抗碰撞

        想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。

  • 容易计算

        原理通俗易懂

  • 细微性(高度离散性)

       对原数据进行任何改动,都会有很大的变化

               

md5的用途

1.防止看到明文 

        因为密码存储到数据库后已经被加密了,即使不法分子拿到数据库中存储的用户密码的值,也无法知道正确的密码。

2.防止抵赖(数字签名)

        将文件加密,传输一个MD5值,如果被修改文件中的内容,对文件重新计算发现md5值不一致,证明中途被篡改。

3.文件上传

4.文件完整性验证

http://t.csdn.cn/Jq1SD

md5加盐

密码+salt值(salt值可以是随机字符串) 再加密

如:密码为123 特定字符串abc        用“12345abc”这个字符串加密

原理

获取md5对象,将目标字符串转换成字节数组,byte[] md5Bytes = md5.digest(byteArray);将字节数组加密,若字节数组长度小于16,转换成字符串StringBuffer,使用append做补0操作。

1.获取信息摘要对象:md5

通过信息摘要单例的构造函数获取:

MessageDigest md5 = MessageDigest.getInstance("MD5");

2.信息摘要对象是对字节数组进行摘要的,所以先获取字符串的字节数组.

byte[] bytes = str.getBytes();

3.信息摘要对象(md5)对字节数组进行摘要,得到摘要字节数组:

byte[] digest = md5.digest(bytes);

4.把摘要数组中的每一个字节转换成16进制,并拼在一起就得到了MD5值. 


原文链接:http://t.csdn.cn/MP7LA

实现

package com.org.code;

import java.security.MessageDigest;

public class EncodeMD5 {

    public static String string2MD5(String str){
        MessageDigest md5 = null;
        try{
            md5 = MessageDigest.getInstance("MD5");//获取加密算法对象
        }catch (Exception e){
            System.out.println(e.toString());
            e.printStackTrace();
            return "";
        }
      //将目标字符串转换成字节数组
        char[] charArray = str.toCharArray();
        byte[] byteArray = new byte[charArray.length];

        for (int i = 0; i < charArray.length; i++)
            byteArray[i] = (byte) charArray[i];
    	
      //将字节数组加密
        byte[] md5Bytes = md5.digest(byteArray);//对字节数组进行摘要
        //用keystr.append  字符串定义时需要用可变的字符串StringBuffer
        StringBuffer haxValue = new StringBuffer();
        for (int i = 0; i < md5Bytes.length; i++){
            //0xff是16进制数,这个刚好8位都是1的二进制数,而且转成int类型的时候,高位会补0
            int val = ((int) md5Bytes[i]) & 0xff;//转换成16进制
//在&正数byte值的话,对数值不会有改变 在&负数数byte值的话,对数值前面补位的1会变成0,
            if (val < 16){
                haxValue.append("0");//位数不够,高位补0
            haxValue.append(Integer.toHexString(val));
        }
        return haxValue.toString();
    }
    public static void main(String[] args) {
        String s = "humane_";
        System.out.println("原始:" + s);
        System.out.println("MD5后:" + string2MD5(s));
    }
}

应用

用户注册——密码加密存储

//调用EncodeMD5中的方法
String password2 =EncodeMD5.string2MD5(password);
//直接存储加密后的字符串
user.setPassword(password2);

用户登录——通过加密规则转换成密文后在跟数据库中存在的密码比对。

//将表单得到的密码加密
String password = request.getParameter("password");
String password2=EncodeMD5.string2MD5(password);
//拿到数据库中存储的密码与现输入的密码比对
User user =UserDAOFactory.getUserDAO().findUser(username);
if(user.getPassword().equals(password2)){//相等就跳转到首页
    response.sendRedirect("index.jsp");
}

 来源于:

百度安全验证

http://t.csdn.cn/To3q8

http://t.csdn.cn/v6Cnm

http://t.csdn.cn/MP7LA

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/LUOZONGW/article/details/127399400

智能推荐

0406任务二高级算法梳理-GBDT算法梳理_gbdt 即利用线性搜索估计叶节点区域的值,使损失函数极小化-程序员宅基地

文章浏览阅读284次。任务四MySQL实战_gbdt 即利用线性搜索估计叶节点区域的值,使损失函数极小化

Lua: Module 'Bit' not found / no file ./bit.so [已解决]_module 'bit' not found:-程序员宅基地

文章浏览阅读1w次。Lua:Module ‘Bit’ not found/no file ./bit.so[已解决]问题描述:问题解决:问题描述:执行lua程序时报错如下:Module ‘Bit’ not found/no file ./bit.so问题解决:在bitop下载最新包:http://bitop.luajit.org/download.html下载到本地后解压:然后在本机ma..._module 'bit' not found:

【ESP32调试-快速入门】-程序员宅基地

文章浏览阅读3.5k次,点赞3次,收藏15次。ESP32调试-快速入门_esp32调试

【工程师学算法】工程常用算法(二)—— 卡尔曼滤波(Kalman Filter)_卡尔曼滤波 精髓-程序员宅基地

文章浏览阅读2w次,点赞184次,收藏973次。一个工程师能走多远,取决于他对数学工具掌握的深度。_卡尔曼滤波 精髓

panel.sh:一个nginx+docker的云函和在线IDE面板,发明你自己的paas(1)_docker有自己的云函数面板吗-程序员宅基地

文章浏览阅读419次。本文关键字:Cannot connect to the Docker daemon at,containerd cannot properly do "clean-up" with shim process during start up,用标准方法实现的类群晖paas,with debugable appliance inside built_docker有自己的云函数面板吗

计算机网络技术的发展趋势,计算机网络技术发展趋势(原稿)-程序员宅基地

文章浏览阅读1.6k次。《计算机网络技术发展趋势(原稿).doc》由会员分享,可免费在线阅读全文,更多与《计算机网络技术发展趋势(原稿)》相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索。1、,计算机网络用户对计算机网络安全技术的需求程度也会不断增加加的,所以我国当前的安全管理部门定要针对计算机安全,网络技术进行有效的研发。计算机网络安全现状计算机网络系统趋于不稳定状态随着当前人们生活节奏的不断加..._计算机网络技术发展三大趋势

随便推点

【前端】在Vue页面中引入其它vue页面 数据传输 相互调用方法等_vue一个页面引用另一个页面-程序员宅基地

文章浏览阅读5k次,点赞3次,收藏11次。那么我们只需要在home.vue想要的地方添加比如我们需要在 home.vue 中引用 headView.Vue。_vue一个页面引用另一个页面

有个码龄 10 年的程序员跟我说:“他编程从来不用鼠标”,我说:_10年码龄-程序员宅基地

文章浏览阅读4.5w次,点赞845次,收藏4k次。2021 年程序员必备 Windows 快捷操作大大大全_10年码龄

JAVA—JVM详解_java jvm-程序员宅基地

文章浏览阅读582次。JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。通过JVM,Java实现了平台无关性。_java jvm

BGP---边界网关协议_边界网关协议不同的管理机构是哪些-程序员宅基地

文章浏览阅读768次。首先RIP是基于UDP进行传输的,而UDP是一个不可靠的协议,他在传输过程中可能会丢失某些数据。缺省情况下,RIP协议的路由更新报文的发送间隔是30S,而如果两个AS内部的路由表非常大,30秒的时间可能还不够将所有的路由信息传递给对方AS,这样,整条链路完全就是为了RIP的通告报文服务,而不能转发数据流量。将UDP协议更换为TCP协议,不用担心数据丢失,并且TCP会预先建立连接,也就让路由器有了一个准备的时间,而不是像RIP一样毫无准备的接受大量更新数据。取消周期更新,改为触发更新。_边界网关协议不同的管理机构是哪些

SVM算法应用综合练习(2)--人脸表情识别_predictor = dlib.shape_predictor('d:\\shape_predic-程序员宅基地

文章浏览阅读1.6k次。@TOC前言本次实验需要使用之前的shape_predictor_68_face_landmarks.dat一、图片预处理import dlib # 人脸识别的库dlibimport numpy as np # 数据处理的库numpyimport cv2 # 图像处理的库OpenCvimport os # dlib预测器detector = dlib.get_frontal_face_detector()# shape_predictor_68__predictor = dlib.shape_predictor('d:\\shape_predictor_68_face_landmarks.dat

肠道微生物可改善围手术期和术后康复效果-程序员宅基地

文章浏览阅读81次。手术,俗称开刀,是医生通过医疗器械对病人身体局部进行去除病变组织、修复损伤等治疗,来维持患者的健康,在治愈疾病方面具有明确的作用。围手术期是指从手术决策到手术结束及术后恢复期的整个时间段。围手术期管理的目标是确保手术的成功和患者的安全。然而,每个患者的情况都是独特的,因此个性化的管理计划是非常重要的。医疗团队会根据患者的具体情况和手术类型制定适合的围手术期管理方案,以最大程度地减少手术风险和并发症,并促进患者的康复。总结下围手术期主要流程和事项(仅供参考):