Java实现MD5加密

在Java中,我们用MD5对数据进行加密,代码大概是这样的:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; public class MD5Utils {
public static void main(String[] args) {
String md5 = md5("luoyesiqiu".getBytes());
System.out.println(md5);
System.out.println(md5.substring(8,24)); } public static String md5(byte[] input){
String md5 = "";
try {
MessageDigest messageDigest = MessageDigest.getInstance("md5");
byte[] buf = messageDigest.digest(input);
for (byte b : buf){
int val = b;
if(val < 0){
val += 256;
}
String str = "" + Integer.toHexString(val);
if(str.length() == 1){
str = "0" + str;
}
md5 += str;
}
} catch (
NoSuchAlgorithmException e) {
e.printStackTrace();
}
return md5;
}
}

以上代码会输出32位的MD5值和16位的MD5值,16位MD5值是从32位中截取的:

10ff0971d5ce668c3a9c20a8c96ba43e
d5ce668c3a9c20a8

分析和实现

众所周知,MD5加密是不可逆的,也就是不能解密。如果,我们想要得到加密前的数据该怎么办?想得到加密前的数据,我们可以Hook呀!Hook MessageDigest类的digest方法,这个方法输入要加密的内容,返回加密的结果,只要Hook这个方法就能得到加密前的数据和加密后的数据了,完美!Hook工具这里用的frida

对于frida,如果要Hook,要写两份代码,一份JavaScript代码,一份Python代码。frida具体使用方法可以去看我以前写的博文:frida的用法--Hook Java代码篇

Python代码

hookMD5.py:

import frida
import sys def read_file_all(file):
fp=open(file)
text=fp.read()
fp.close()
return text
pass def on_message(message, data):
if message['type'] == 'error':
print("[!] " + message['stack'])
elif message['type'] == 'send':
print(message['payload'])
if data != None:
print("[data] " + format_bytes(data))
else:
print(message)
pass def format_bytes(bytes):
string='['
for b in bytes:
string=string+str(b)+','
return string[:len(string)-1]+"]"
pass def main():
dev = frida.get_usb_device() session = dev.attach("com.xxxx.xxxx")
text = read_file_all("hookMD5.js") script = session.create_script(text)
script.on('message', on_message)
script.load()
sys.stdin.read()
pass main()

注:com.xxxx.xxxx改成自己想要Hook的App包名

JavaScript代码

digest方法有两个重载方式,我们把它们都给Hook了。

hookMD5.js:

var algorithm = 'MD5';

if(Java.available)
{
Java.perform(function(){
var MessageDigest= Java.use('java.security.MessageDigest');
var digest1 = MessageDigest.digest.overload("[B","int","int");
digest1.implementation=function(buf,offset,len){
var ret = digest2.call(this,buf);
parseIn(this,buf);
parseOut(this,ret);
return ret;
} var digest2 = MessageDigest.digest.overload("[B");
digest2.implementation=function(buf){
var ret = digest2.call(this,buf);
parseIn(this,buf);
parseOut(this,ret);
return ret;
}
}); } function parseIn(digest,input){
var Integer= Java.use('java.lang.Integer');
var String= Java.use('java.lang.String');
if(digest.getAlgorithm() != algorithm){
return;
}
try{
console.log("original:"+String.$new(input));
}
catch(e){
console.log(parseHex(input));
}
} function parseOut(digest,ret){
var Integer= Java.use('java.lang.Integer');
var String= Java.use('java.lang.String');
var result = "";
for(var i = 0;i<ret.length;i++){
var val = ret[i];
if(val < 0){
val += 256;
}
var str = Integer.toHexString(val);
if(String.$new(str).length()==1){
str = "0" + str;
}
result += str;
} if(digest.getAlgorithm()==algorithm){
console.log(digest.getAlgorithm() + "(32):" + result);
console.log(digest.getAlgorithm() + "(16):" + result.substring(8,24));
console.log("");
}
} function parseHex(input){
var Integer= Java.use('java.lang.Integer');
var byte_array = "";
for(var j = 0;j<input.length;j++){
var hex = Integer.toHexString(input[j]);
if(hex.length == 1){
hex = "0" + hex;
}
byte_array += hex;
} console.log("original(hex):");
var pair = "";
var hex_table = "";
for(var k = 0;k<byte_array.length;k++){
pair += byte_array.charAt(k);
if((k+1)%2 == 0){
pair += " "
hex_table += pair;
pair = ""
} if((k+1)%32 == 0){
hex_table += "\n"
}
}
return hex_table;
}

写好后把两个脚本放在同一个目录,运行Python脚本:

python hookMD5.py

Hook某App运行结果如下:

上面的frida脚本,不仅可以Hook MD5算法流程,还可以Hook SHA家族的散列算法流程,修改Javascript脚本开头的algorithm变量即可达到目的,读者可以自行尝试。

Hook Java API以获得MD5加密前数据的更多相关文章

  1. 利用Java自带的MD5加密java.security.MessageDigest;

    MD5加密算法,即"Message-Digest Algorithm 5(信息-摘要算法)",它由MD2.MD3.MD4发展而来的一种单向函数算法(也就是HASH算法),它是国际著 ...

  2. JAVA中简单的MD5加密类(MD5Utils)

    MD5加密分析:   JDK API:   获取对象的API:   加密的API:   package cn.utils; import java.security.MessageDigest; im ...

  3. 利用Java自带的MD5加密

    package test.md5; import java.security.MessageDigest; public class MD5Util { public final static Str ...

  4. Java实现对文本文件MD5加密并ftp传送到远程主机目录

    需求描述: 客户出完账之后需要把出账的数据以文本文件的方式传送给收入管理系统,客户以前是通过本地的一个工具软件上传的,由于安全监管的原因,不允许在本地使用工具上传,因此客户希望我们在已经上线使用的系统 ...

  5. java ldap用户密码md5加密

    在这里不过多介绍ldap,因为这样的文章特别多,这里就简单直接的记录这一个问题. 在springboot中通过引入spring-boot-starter-data-ldap,使用LdapTemplat ...

  6. JAVA实现AES和MD5加密

    package test; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; ...

  7. Java 实现32位MD5加密

    MD5介绍[链接] Java代码实现 public class Md5Util { private String Md5Util(String s) { try { MessageDigest md ...

  8. 解决java,C#,php,python MD5加密不一致问题

    JAVA写法 public static String md5Base64(final String str, final String key) throws Exception { if ((nu ...

  9. 2 MD5加密 java实现

    百度百科对MD5的说明是: Message Digest Algorithm MD5(中文名为消息摘要算法第 五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护. MD5即Mess ...

随机推荐

  1. jenkins + maven + nexus + [ svn 或 GitLab 或 GitHub ]

    目录 介绍 DevOps平台四大模块 针对DevOps开源项目 Jenkins 介绍 Maven 介绍 maven的核心概念介绍 SVN介绍 Nexus介绍 Maven私服的 个特性: 流程图 环境搭 ...

  2. LAMP架构介绍、MySQL、MariaDB介绍、MySQL安装

    5月23日任务 课程内容: 11.1 LAMP架构介绍11.2 MySQL.MariaDB介绍11.3/11.4/11.5 MySQL安装扩展mysql5.5源码编译安装 http://www.ami ...

  3. 成为高手前必懂的TCP干货【华为云技术分享】

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

  4. 华为路由交换-DHCP

    DHCP 一. 配置基于接口地址池的DHCP 1.1实验原理 随着网络规模的扩大和网络复杂程度的提高,计算机位置变化(如便携机或无线网络)和计算机数量超过可分配的IP地址的情况将会经常出现.DHCP( ...

  5. 在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1)

    题目:在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1) 分析:这道题考察位操作:异或(^),按位与(&),移位操作(>> ...

  6. 移动开发在路上-- IOS移动开发系列 多线程一

    类似于什么是进程什么是线程在这里我就不多浪费时间了(Google一下什么都有)! 废话不多说先上图,我相信大家都是喜欢看图的人,俗话说得好,求图求真相吗?虽然这里只有屌丝一个但是真相还是会有的... ...

  7. 【解决】image ... could not be accessed on a registry to record its digest.

    [问题]image jmdiservice:1206 could not be accessed on a registry to record its digest. Each node will ...

  8. 2019 ICPC上海网络赛 A 题 Lightning Routing I (动态维护树的直径)

    题目: 给定一棵树, 带边权. 现在有2种操作: 1.修改第i条边的权值. 2.询问u到其他一个任意点的最大距离是多少. 题解: 树的直径可以通过两次 dfs() 的方法求得.换句话说,到任意点最远的 ...

  9. CF 526F Max Mex(倍增求LCA+线段树路径合并)

    Max Mex 题目地址:https://codeforces.com/contest/1084/problem/F 然后合并时注意分情况讨论: 参考代码: #include<bits/stdc ...

  10. Python文件头注释的含义,你肯定不懂

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:冰火梦幻  本文档描述了Python语言文件头里典型注释的含义. 1. ...