MD5加密及’解密‘ 验签详解
来源:互联网 发布:apache服务器 ubuntu 编辑:程序博客网 时间:2024/05/21 07:46
为什么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));
}
}
阅读全文
1 0
- MD5加密及’解密‘ 验签详解
- 加密解密、签名验签
- 加密解密 签名验签
- 加密 解密 签名 验签
- 总结之:CentOS6.5下openssl加密解密及CA自签颁发证书详解
- 总结之:CentOS6.5下openssl加密解密及CA自签颁发证书详解
- CentOS6.5下openssl加密解密及CA自签颁发证书详解
- CentOS6.5下openssl加密解密及CA自签颁发证书详解
- RSA加密、解密、签名、验签 DSA签名、验签
- 加密解密 签名验签学习笔记
- php rsa 加密、解密、签名、验签
- 加密解密 签名验签学习笔记
- 数据加密、解密:签名、验签
- 加密解密 签名验签学习笔记
- RSA文件加密解密和验签
- 加密解密-签名验签学习笔记
- 加密解密 签名验签学习笔记
- 微信小程序 RSA加密 解密 加签 验签
- 对对热敏打印机如何连接WiFi打印工作备忘录教程
- ligerUi使用方法小结-用实际教训总结经验
- DNS劫持和HTTP劫持有什么区别?
- 牛客网数据库选择题笔记—1
- 磁盘镜像分析工具Autopsy
- MD5加密及’解密‘ 验签详解
- 19.软件生命周期(1)
- ng2-webstorm-snippets
- HttpServletRequestWrapper和jsp:param之间的问题及XSS防御
- LintCode-----17.带重复元素的子集
- mongodb实现类似sql中distinct的效果
- Android 下面调起键盘后的样式兼容性问题
- C++ Socket(六)
- OGG Configuring DDL Support