JAVA 生成 MD5摘要 和SHA1摘要 及MD5的彩虹表破解

MD5  和SHA1 这两个摘要算法,使用很普遍,几乎每个项目我们都会用这两个算法来骗自己和骗用户,看啊,我们保存的用户密码是加密的。对,存的不是明文,是密文。然而MD5真的安全么?

上干货

JAVA生成MD5摘要的代码:

MessageDigest md5 =MessageDigest.getInstance("MD5");
        String messageStr="123456";
        md5.update(messageStr.getBytes());
        byte[] summery= md5.digest();
        StringBuffer md5StrBuff = new StringBuffer();
        for (int i = 0; i < summery.length; i++) {  
                if (Integer.toHexString(0xFF & summery[i]).length() == 1){  
                    md5StrBuff.append("0").append(  
                            Integer.toHexString(0xFF & summery[i]));  
                }else{  
                    md5StrBuff.append(Integer.toHexString(0xFF & summery[i]));  
                }  
            } 
        
        System.out.println(md5StrBuff.toString());

输出结果 :

e10adc3949ba59abbe56e057f20f883e

但是MD5真的安全么?

这里我们可以老生长谈一下,MD5是单向函数,不能反向求解,MD5是抗碰撞的。不存在两不同的文本生成相同的摘要,但是可以用彩虹表查啊,通过穷举名文并生成相应的摘要以键值对的形式存入数据库我们就得到了一张彩虹表,然后我们只需要拿着密文去数据库里查

结果如图:

下面我们来看SHA 1

JAVA生成SHA1摘要的代码:

MessageDigest md5 =MessageDigest.getInstance("SHA");
        String messageStr="123456";
        md5.update(messageStr.getBytes());
        byte[] summery= md5.digest();
        StringBuffer md5StrBuff = new StringBuffer();
        for (int i = 0; i < summery.length; i++) {  
                if (Integer.toHexString(0xFF & summery[i]).length() == 1){  
                    md5StrBuff.append("0").append(  
                            Integer.toHexString(0xFF & summery[i]));  
                }else{  
                    md5StrBuff.append(Integer.toHexString(0xFF & summery[i]));  
                }  
            } 
        
        System.out.println(md5StrBuff.toString());

同样的问题SHA1就真的安全么?

SHA1和MD5是现在业内被用户普遍认可的安全摘要算法,经常用来加密用户密码这类的敏感信息,作为一个有良知的程序员我觉得这件事一定要说明白。MD5和SHA1在彩虹表面前脆弱的不堪一击。

补充:

1.这里再补充一个小小的细节,MD5和SHA1摘要算法生成的是字节数组,每一位里存的是一个十六进制数,想要输出出来不能直接toString因为你不能把一个16进制数映射到UTF-8或者GBK字符集上,所以如果想以字符的形式输出需要先转换成16进制字符串再进行输出。

时间: 2024-12-26 19:57:02

JAVA 生成 MD5摘要 和SHA1摘要 及MD5的彩虹表破解的相关文章

用彩虹表破解MD5、LM Hash等复杂加密密码

一.什么是彩虹表? 彩虹表(Rainbow Tables)就是一个庞大的.针对各种可能的字母组合预先计算好的哈希值的集合,不一定是针对MD5算法的,各种算法的都有,有了它可以快速的破解各类密码.越是复杂的密码,需要的彩虹表就越大,现在主流的彩虹表都是100G以上. 二.上哪找彩虹表去? 现在有很多大牛已经把自己的彩虹表共享出来了,所以你可以去下载.还有一种方法就是自己通过工具生成. 不过自己生成有点不切合实际,生成小的彩虹表吧数据少,可以破解密码的位数少(复杂程度低),而且费时费力,4核4GB内

Java Base64、AES、SHA1、MD5加密算法(转载)

1 package com.example.decript; 2 3 import java.io.UnsupportedEncodingException; 4 import java.security.InvalidKeyException; 5 import java.security.MessageDigest; 6 import java.security.NoSuchAlgorithmException; 7 import java.security.SecureRandom; 8

使用摘要流获取文件的MD5

摘要流是过滤流的一种,使用它可以再读取和写入流时获取流的摘要信息(MD5/SHA). 使用摘要流包装流时,需要额外传递一个MessageDigest对象, MessageDigest md=MessageDigest.getInstance("MD5"); DigestInputStream dis=new DigestInputStream(in, md); 摘要流复写了流的read.write方法,方法内部调用MessageDigest对象的upate()来更新摘要信息 publi

python 中md5 和 sha1 加密, md5 + os.urandom 生成全局唯一ID

首先先来介绍一下md5 和 sha1 的概念 MD5 MD5的全称是Message-Digest Algorithm 5(信息-摘要算法).128位长度.目前MD5是一种不可逆算法. 具有很高的安全性.它对应任何字符串都可以加密成一段唯一的固定长度的代码. SHA1 SHA1的全称是Secure Hash Algorithm(安全哈希算法) .SHA1基于MD5,加密后的数据长度更长, 它对长度小于264的输入,产生长度为160bit的散列值.比MD5多32位. 因此,比MD5更加安全,但SHA

&lt;&lt;&lt; Java生成Md5

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 package cn.sevennight.test; import java.security.MessageDigest; public class md5{     public static String MD5(String text) {         try {             MessageDi

java生成字符串的MD5值

下面的代码实现了MD5值的生成: public class MD5Test2 { public static void main(String[] args) { System.out.println(MD5Test2.MD5Operation("hello")); System.out.println(MD5Test2.getMD5("hello")); } //通过java.math包的BigInteger类实现十六进制的转换 public final stat

python 处理java生成的证书流程

python 处理java生成的证书流程,以及公钥私钥加密,加签验签,aes加解密(这里用的是M2Crypto库里面的RSA X509 EVP) java生成的jks证书python不能直接使用需要转换成pem格式可用以下命令(需要先安装keytool(网上很多例子)) keytool -importkeystore -srckeystore xxxx.jks -destkeystore xxxx.p12 -srcstoretype jks -deststoretype pkcs12 上一命令只

这么多年被第三方接入坑的那些事。。。关于md5签名和sha1证书的坑

大家经常会接入第三方的东西,最常用的就是各种登录,什么QQ,微信,微博之类的.每一次我们在接入的时候都会发现他们需要md5签名 或者是 sha1证书.这里是一个很大的坑,很多基础不够的童鞋就会中招,然后浪费大量的时间在无用的调试上面. 大家要明确一点不管是用官方的md5签名生成还是用cygwin的签名生成,都是在用ant或者用gradle打包的时候根据你的每一个apk的证书生成的,这里的证书概念是指keystore,每一个apk需要在硬件环境中安装都要有一个证书,只是我们调试的时候用的证书是我们

java生成随机字符串uuid

GUID是一个128位长的数字,一般用16进制表示.算法的核心思想是结合机器的网卡.当地时间.一个随即数来生成GUID.从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复. UUID是1.5中新增的一个类,在java.util下,用它可以产生一个号称全球唯一的ID package com.mytest; import java.util.UUID; public class UTest { public static void main(Stri