Java 实现MD5加密「建议收藏」

Java 实现MD5加密「建议收藏」Java实现MD5加密

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

说到MD5,那我们首先要知道什么是MD5,开始吧

 MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。比如,在UNIX下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如: 

  MD5 (tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461 

  这就是tanajiya.tar.gz文件的数字签名。MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。为了让读者朋友对MD5的应用有个直观的认识,笔者以一个比方和一个实例来简要描述一下其工作过程: 

  大家都知道,地球上任何人都有自己独一无二的指纹,这常常成为公安机关鉴别罪犯身份最值得信赖的方法;与之类似,MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的“数字指纹”,如果任何人对文件名做了任何改动,其MD5值也就是对应的“数字指纹”都会发生变化。 

  我们常常在某些软件下载站点的某软件信息中看到其MD5值,它的作用就在于我们可以在下载该软件后,对下载回来的文件用专门的软件(如Windows MD5 Check等)做一次MD5校验,以确保我们获得的文件与该站点提供的文件为同一文件。利用MD5算法来进行文件校验的方案被大量应用到软件下载站、论坛数据库、系统文件安全等方面。 

  MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫 readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。 

  MD5还广泛用于操作系统的登陆认证上,如Unix、各类BSD系统登录密码、数字签名等诸多方。如在UNIX系统中用户的密码是以MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行MD5 Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。MD5将任意长度的“字节串”映射为一个128bit的大整数,并且是通过该128bit反推原始字符串是困难的,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。所以,要遇到了md5密码的问题,比较好的办法是:你可以用这个系统中的md5()函数重新设一个密码,如admin,把生成的一串密码的Hash值覆盖原来的Hash值就行了。 

  正是因为这个原因,现在被黑客使用最多的一种破译密码的方法就是一种被称为”跑字典”的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。我们假设密码的最大长度为8位字节(8 Bytes),同时密码只能是字母和数字,共26+26+10=62个字符,排列组合出的字典的项数则是P(62,1)+P(62,2)….+P(62,8),那也已经是一个很天文的数字了,存储这个字典就需要TB级的磁盘阵列,而且这种方法还有一个前提,就是能获得目标账户的密码MD5值的情况下才可以。这种加密技术被广泛的应用于UNIX系统中,这也是为什么UNIX系统比一般操作系统更为坚固一个重要原因。

通过上边的资料我们大概可以知道,MD5是一种难以逆向(逆转)的加密方式,那么我们在程序中,究竟怎么使用呢??

今天的案例,就来解答的下疑惑吧!

 

 

package cn.arebirth.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5 {
    public static String getMD5(String plainText, int length) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");//获取MD5实例
            md.update(plainText.getBytes());//此处传入要加密的byte类型值
            byte[] digest = md.digest();//此处得到的是md5加密后的byte类型值

            /*
               下边的运算就是自己添加的一些二次小加密,记住这个千万不能弄错乱,
                   否则在解密的时候,你会发现值不对的(举例:在注册的时候加密方式是一种,
                在我们登录的时候是不是还需要加密它的密码然后和数据库的进行比对,但是
            最后我们发现,明明密码对啊,就是打不到预期效果,这时候你就要想一下,你是否
             有改动前后的加密方式)   
            */
            int i;
            StringBuilder sb = new StringBuilder();
            for (int offset = 0; offset < digest.length; offset++) {
                i = digest[offset];
                if (i < 0)
                    i += 256;
                if (i < 16)
                    sb.append(0);
                sb.append(Integer.toHexString(i));//通过Integer.toHexString方法把值变为16进制
            }
            return sb.toString().substring(0, length);//从下标0开始,length目的是截取多少长度的值
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }
}

 

通过上边的代码我们就可以实现一个简单的注册和登录时候的加密解密方式啦!具体实现就不做演示了,把思路留下,不会的小伙伴思考下。

ps:

注册的时候:我们把密码的值进行MD5加密后在塞入数据库

登录的时候:我们把密码的值进行MD5加密然后去和数据库里面的值进行比对

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

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

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


相关推荐

  • springboot实现热部署

    springboot实现热部署文章目录前言原理方式开始配置在pom.xml中添加依赖devtools的配置IDEA中配置测试参考资料&小结小结参考资料前言在实际开发过程中,每次修改代码就得将项目重启,重新部署,对于一些大型应用来说,重启时间需要花费大量的时间成本。对于一个后端开发者来说,重启过程确实很难受啊。在Java开发领域,热部署一直是一个难以解决的问题,目前的Java虚拟机只能实现方法体的修改热部署,…

    2022年5月23日
    44
  • python进阶(11)生成器[通俗易懂]

    python进阶(11)生成器[通俗易懂]生成器利用迭代器,我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成。但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记录,进而才能根据当前状态生成下一个数据。

    2022年7月30日
    8
  • 什么是机器学习?

    什么是机器学习?1.引言为了解决计算机上的问题,我们需要一个算法。算法是应该执行以将输入变换到输出的指令序列。例如,可以设计用于排序的算法。输入是一组数字,输出是它们的有序列表。对于相同的任务,可以有各种算法,并且

    2022年8月4日
    6
  • 【面试真经】2020年7月 Linux运维面试题(含答案版)

    【面试真经】2020年7月 Linux运维面试题(含答案版)一.在当前文件目录下,有文件file1查询file1里面空行的所在行号查询file2以abc结尾的行打印出file1文件第一行到第3行二.如何将本地80端口的请求转发到8080端口,当前的主机IP为192.168.2.1三.crontab如何设置在11月份的每天早上6点到12点中,每隔2个小时执行/usr/bin/httpd.sh怎么实现四.编写个shell脚本将/usr/local/test目录下大于100K的文件转移到/tmp目录下五.简述raid0ra

    2022年6月10日
    34
  • vim配置vimrc详解

    vim配置vimrc详解vimrc的存放位置:#系统vimrc文件:”$VIM/vimrc”用户vimrc文件:”$HOME/.vimrc”用户exrc文件:”$HOME/.exrc”系统gvimrc文件:”$VIM/gvimrc”用户gvimrc文件:”$HOME/.gvimrc”系统菜单文件:”$VIMRUNTIME/menu.vim”$VIM预设值:”/usr/share/vim”vimrc文件内容:syntaxon”自动语法高亮”…

    2022年5月30日
    46
  • html 的scor属性,scrollheight属性「建议收藏」

    html 的scor属性,scrollheight属性「建议收藏」scrollHeight属性是属于什么范畴?CSS布局HTML小编今天和大家分享问大神,Height属性到底指的是什么html设置overflow-x:scroll;属性后怎么让指定位如果页面不够长(至少窗口长度两倍),那肯定滚动不到一半的位置。否则任何浏览器都不会产生误差。下面的例子输出100个,页面加载的时候会滚动到第51个。window.onload=function(…

    2022年7月23日
    16

发表回复

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

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