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

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

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

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变量即可达到目的,读者可以自行尝试。

java 赋值md5_Hook Java API以获得MD5加密前数据相关推荐

  1. MD5加密 java实现

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

  2. md5碰撞Java_2 MD5加密 java实现

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

  3. Java实现MD5加密和文件校验

    MD5简介: MD5的全称:Message-Digest Algorithm 5(信息-摘要算法5) MD5的加密方式是一种哈希加密.一些主流的编程语言都已经实现了MD5的加密,所以如果你的程序或是系 ...

  4. java 随机md5_java常用工具类 Random随机数、MD5加密工具类

    本文实例为大家分享了java常用工具类的具体代码,供大家参考,具体内容如下 random随机数工具类 package com.jarvis.base.util; import java.util.ra ...

  5. md5加密校验 java_Java实现MD5加密和文件校验

    MD5简介: MD5的全称:Message-Digest Algorithm 5(信息-摘要算法5) MD5的加密方式是一种哈希加密.一些主流的编程语言都已经实现了MD5的加密,所以如果你的程序或是系 ...

  6. guava实现MD5加密

    java源码不太方便实现MD5加密, 工程中引用apache guava包来实现 实现代码 String a = "I'm testing"; String md = Hashin ...

  7. MD5加密工具类(实战版)

    MD5加密工具类(实战版) 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成 ...

  8. 数据库(DataBase)-数据库级别MD5加密

    3.数据库级别MD5加密(拓展项) 什么是MD5? MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节 ...

  9. springboot项目系列-论坛系统05全局异常处理+日志处理+MD5加密

    springboot项目系列-论坛系统05全局异常处理+日志处理使用了spring的AOP 论坛地址:http://www.cywloveyou.top 配置日志 logging:level:root ...

最新文章

  1. 掌握图神经网络GNN基本,看这篇文章就够了
  2. 建立一个Web项目及一些错误解决办法
  3. 使用单独的解决方案(类库)来开发DNN的模块-C#版本(2)
  4. 【Luogu1393】动态逆序对(CDQ分治)
  5. [剑指offer]面试题第[36]题[JAVA][二叉搜索树与双向链表][递归]
  6. js一个按钮弹出两个按钮_车内常见按钮,你却一个不认识?一分钟带你认识车内常见按钮...
  7. 开源网格划分软件_网格划分:PointWise 18.3R1
  8. [雪峰磁针石博客]2018最佳人工智能数据采集(爬虫)工具书下载
  9. 列车运行图的编制原则是什么_我国农村将有序推进村庄规划编制
  10. html画布创建黑白象棋棋盘,canvas应用——中国象棋棋盘
  11. Python从入门到实践-第三章习题
  12. (转)大数据量分页存储过程效率测试附代码
  13. Arduino基础入门二之呼吸灯
  14. 2021-2027全球与中国可待因止疼药市场现状及未来发展趋势
  15. 计算机设备标签怎么贴,电脑怎么打印不干胶标签 电脑打印不干胶标签操作流程【图文】...
  16. 假如生命是乏味的,我怕有来生;假如生命是有趣的,今生已是满足。
  17. 解决HP 3055 一体机与U盘冲突
  18. 什么是Arduino?
  19. Python数据分析之--运动员数据揭秘(一)
  20. 反馈概念、反馈分类、判断反馈极性的3φ法

热门文章

  1. mount挂载光盘media_Linux挂载光盘命令
  2. 中日文字编码转换_关于编码你必须知道的知识和技巧
  3. python2.7安装报错_python2.7源码安装方式
  4. Python使用多线程搜索指定范围内的所有素数
  5. 几行Python代码生成饭店营业额模拟数据并保存为CSV文件
  6. 哪些手机搭载鸿蒙,鸿蒙2.0搭载手机吗-有什么功能
  7. linux重启后版本变了,linux – 重启后如何使设备映射保持不变?
  8. 斜面孔如何绘制_如何才能做好钢结构厂房基础设计
  9. tomcat最新版本是多少_Tomcat在Windows 10下的安装配置教程
  10. java 项目拆分_java – 多模块项目什么时候应该拆分成单独的存储库树?