MD5加密及’解密‘ 验签详解

为什么MD5不能解密?
MD5 是不可逆的
也就是没有对应的算法,能从生产的md5值逆向得到原始数据。
md5作为数据库中的主键可行吗?这就涉及到一个问题,md5值是唯一的吗?答案是,不唯一。
也就是一个原始数据,只对应一个md5值;但是一个md5值,可能对应多个原始数据。
MD5加密原理是散列算法,散列算法也称哈希算法。
计算机专业学的数据结构就有哈希表这一知识点。
比如10除以3余数为一,4除以3余数也为一,但余数为一的就不知道这个数是哪个了。
所以md5不能解密。

验证及破解方法
因为MD5不可逆 所以验证登录密码是否正确这一操作一般都是通过 再次加密 加密完比对两次加密的结果,看结果是否一致 来证实是否正确!

Java中常用的Md5+Key的方式对Url签名防篡改的方法:
最近系统接入支付宝,在demo中看到了如何对get请求的url签名防止篡改的方法,觉得不错特此记录一下。
实现方式是:Md5(url+key) 的方式进行的。
1、key可以是任意的字符串,然后“客户端”,“服务器端”各自保留一份,千万不能外泄。
2、请求的URL例如:  name=jack&age=18
3、 URL+Key字符串拼接后的值用MD5加密生成签名,将签名发送到服务器端,同时服务器端已同样的方式计算出签名,然后比较俩个MD5的值是否相同,来确定URL是否被篡改。
4、别人拿不到key是无法正确计算出签名的。

下面例子包含 htmlunit 模拟表达提交 访问 http://www.cmd5.com/  获得解密的结果

package util;
import java.io.IOException;
import java.net.MalformedURLException;
import java.security.MessageDigest;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomNode;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
public class MD5Util {
     /**
      * 生成md5
      *
      * @param message
      * @return
      */
     public static String getMD5(String message) {
           String md5str = "";
           try {
                // 1 创建一个提供信息摘要算法的对象,初始化为md5算法对象
                MessageDigest md = MessageDigest.getInstance("MD5");
                // 2 将消息变成byte数组
                byte[] input = message.getBytes();
                // 3 计算后获得字节数组,这就是那128位了
                byte[] buff = md.digest(input);
                // 4 把数组每一字节(一个字节占八位)换成16进制连成md5字符串
                md5str = Hex.encodeHexStr(buff);
           } catch (Exception e) {
                e.printStackTrace();
           }
           return md5str;
     }
     public static String VerifyMD5(String Result, String newInput) {
           String md5str = "";
           try {
                // 1 创建一个提供信息摘要算法的对象,初始化为md5算法对象
                MessageDigest md = MessageDigest.getInstance("MD5");
                // 2 将消息变成byte数组
                byte[] input = newInput.getBytes();
                // 3 计算后获得字节数组,这就是那128位了
                byte[] buff = md.digest(input);
                // 4 把数组每一字节(一个字节占八位)换成16进制连成md5字符串
                md5str = Hex.encodeHexStr(buff);
                if (md5str.equals(Result)) {
                     return "验证密码通过!";
                } else {
                     return "验证密码失败!";
                }
           } catch (Exception e) {
                e.printStackTrace();
           }
           return "验证失败!";
     }
     public static String HtmlUnitVerify(String md5str)
                throws FailingHttpStatusCodeException, MalformedURLException,
                IOException {
           final WebClient webClient = new WebClient();
           webClient.getOptions().setCssEnabled(false);
           webClient.getOptions().setJavaScriptEnabled(false);
           final HtmlPage page = webClient.getPage("http://www.cmd5.com/");
           HtmlTextInput hs = (HtmlTextInput) page
                     .getElementById("ctl00_ContentPlaceHolder1_TextBoxInput");
           hs.setValueAttribute(md5str);
           HtmlElement he = (HtmlElement) page
                     .getElementById("ctl00_ContentPlaceHolder1_Button1");
           HtmlPage pageresult = he.click();
           // System.out.println(pageresult.asText());
           HtmlElement span = (HtmlElement) pageresult
                     .getElementById("ctl00_ContentPlaceHolder1_LabelAnswer");
           DomNode answer = span.getFirstChild();
           // System.out.println(answer.asText());
           webClient.closeAllWindows();
           if (answer.asText().contains("查")) {
                return "破解失败!";
           } else {
                return answer.asText();
           }
     }
     public static void main(String[] args)
                throws FailingHttpStatusCodeException, MalformedURLException,
                IOException {
           String str = "sunjun123";
           String md5str = "781E5E245D69B566979B86E28D23F2C7";
           System.out.println(getMD5(str));
           String result = HtmlUnitVerify(getMD5(str));
           System.out.println(result);
           // System.out.println(VerifyMD5(md5str,str));
     }
}






  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值