MD5验证
commons-codec包可以从apache下载:http://commons.apache.org/codec/download_codec.cgi
MD5现在是用来作为一种数字签名算法,即A向B发送数据m,为了让B确信数据是A送来的并且没有被篡改于是A就是用hash算法将数据散列一并发送给 B。B接收到文件以后也用相同的hash算法校验数据是否被修改。主要是防止数据被修改的。MD5值的重复就是所谓的碰撞。
获取文件的MD5码:
System.out.println(DigestUtils.md5Hex(new FileInputStream(new File("C:/ttt/new1328505655521"))));
获取字符串MD5码:
System.out.println(DigestUtils.md5Hex(string));
22222222222222222222
今天在这个问题上花费了一部分时间,起初,自己借别人的类,在Android项目中采用Java应用md5校验文件发现和在linux下采用命令md5sum校验文件结果不一致。
这个问题,太惊奇了!
最后直接下结果吧:
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class TestMD5 {
public static String md5( byte[] key) {
String cacheKey;
try {
final MessageDigest mDigest = MessageDigest.getInstance("MD5");
mDigest.update(key);
cacheKey = bytesToHexString(mDigest.digest());
} catch (NoSuchAlgorithmException e) {
cacheKey = String.valueOf(key.hashCode());
}
return cacheKey;
}
private static String bytesToHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(0xFF & bytes[i]);
if (hex.length() == 1) {
sb.append('0');
}
sb.append(hex);
}
return sb.toString();
}
private static byte[] getBytes(String filePath){
byte[] buffer = null;
try {
File file = new File(filePath);
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
byte[] b = new byte[1000];
int n;
while ((n = fis.read(b)) != -1) {
bos.write(b, 0, n);
}
fis.close();
bos.close();
buffer = bos.toByteArray();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return buffer;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String path = "D:\\Android\\Test.apk";
String md5Value = md5(getBytes(path));
System.out.println("md5Value =====" + md5Value);
}
}
Linux上验证后,发现结果一致了,先简单记录下,后面在详细深入研究,并下文档记录。
3333333333333333333333333
MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改。MD5全称是报文摘要算法(Message-Digest Algorithm
5),此算法对任意长度的信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)的“指纹”(或称“报文摘要”),不同的文件产生相同的报文摘要的可能性是非常非常之小的。
在linux或Unix上,md5sum是用来计算和校验文件报文摘要的工具程序。一般来说,安装了Linux后,就会有md5sum这个工具,直接在命令行终端直接运行。
使用md5sum来产生指纹(报文摘要)命令如下:
md5sum file > file.md5
或者
md5sum file >>file.md5
也可以把多个文件的报文摘要输出到一个md5文件中,这要使用通配符*,比如某目录下有几个iso文件,要把这几个iso文件的摘要输出到iso.md5文件中,命令如下:
md5sum *.iso > iso.md5
2、使用md5报文摘要验证文件,方法有二:
把下载的文件file和该文件的file.md5报文摘要文件放在同一个目录下,然后用如下命令进行验证:
md5sum -c file.md5
然后如果验证成功,则会输出:正确
md5sum passwd passwd.bak /etc/passwd
--------------------------------------
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Utils {
/*
* 传入一个字符串String msg,返回Java MD5加密后的16进制的字符串结果。
* 结果形如:c0e84e870874dd37ed0d164c7986f03a
*/
public static String getMD5(String msg) {
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
md.reset();
md.update(msg.getBytes());
byte[] bytes = md.digest();
String result = "";
for (byte b : bytes) {
// byte转换成16进制
result += String.format("%02x", b);
}
return result;
}
// 测试
// public static void main(String[] args) {
// String msg = "hello,world!";
// System.out.println(getMD5(msg));
// }
}
------------------------------
444444444444444444444
import java.security.MessageDigest; /**
* Md5 工具
*/
public class Md5Util { private static MessageDigest md5 = null;
static {
try {
md5 = MessageDigest.getInstance("MD5");
} catch (Exception e) {
System.out.println(e.getMessage());
}
} /**
* 用于获取一个String的md5值
* @param string
* @return
*/
public static String getMd5(String str) {
byte[] bs = md5.digest(str.getBytes());
StringBuilder sb = new StringBuilder(40);
for(byte x:bs) {
if((x & 0xff)>>4 == 0) {
sb.append("0").append(Integer.toHexString(x & 0xff));
} else {
sb.append(Integer.toHexString(x & 0xff));
}
}
return sb.toString();
} public static void main(String[] args) {
System.out.println(getMd5("hello world"));
}
}
for(i=0;i<len;i++)
output[outpos+i]=input[inpos+i];
}
void trans (byte block[]){
long a=state[0],b=state[1],c=state[2],d=state[3];
long[] x = new long[16];
Decode (x, block, 64);
a = X1 (a, b, c, d, x[0], S11,0xd76aa478L);//1
d = X1 (d, a, b, c, x[1], S12,0xe8c7b756L);
c = X1 (c, d, a, b, x[2], S13,0x242070dbL);
b = X1 (b, c, d, a, x[3], S14,0xc1bdceeeL);
a = X1 (a, b, c, d, x[4], S11,0xf57c0fafL);
d = X1 (d, a, b, c, x[5], S12,0x4787c62aL);
c = X1 (c, d, a, b, x[6], S13,0xa8304613L);
b = X1 (b, c, d, a, x[7], S14,0xfd469501L);
a = X1 (a, b, c, d, x[8], S11,0x698098d8L);
d = X1 (d, a, b, c, x[9], S12,0x8b44f7afL);//10
c = X1 (c, d, a, b, x[10],S13,0xffff5bb1L);
b = X1 (b, c, d, a, x[11],S14,0x895cd7beL);
a = X1 (a, b, c, d, x[12],S11,0x6b901122L);
d = X1 (d, a, b, c, x[13],S12,0xfd987193L);
c = X1 (c, d, a, b, x[14],S13,0xa679438eL);
b = X1 (b, c, d, a, x[15],S14,0x49b40821L);
a = X2 (a, b, c, d, x[1], S21,0xf61e2562L);
d = X2 (d, a, b, c, x[6], S22,0xc040b340L);
c = X2 (c, d, a, b, x[11],S23,0x265e5a51L);
b = X2 (b, c, d, a, x[0], S24,0xe9b6c7aaL);//20
a = X2 (a, b, c, d, x[5], S21,0xd62f105dL);
d = X2 (d, a, b, c, x[10],S22,0x02441453L);
c = X2 (c, d, a, b, x[15],S23,0xd8a1e681L);
b = X2 (b, c, d, a, x[4], S24,0xe7d3fbc8L);
a = X2 (a, b, c, d, x[9], S21,0x21e1cde6L);
d = X2 (d, a, b, c, x[14],S22,0xc33707d6L);
c = X2 (c, d, a, b, x[3], S23,0xf4d50d87L);
b = X2 (b, c, d, a, x[8], S24,0x455a14edL);
a = X2 (a, b, c, d, x[13],S21,0xa9e3e905L);
d = X2 (d, a, b, c, x[2], S22,0xfcefa3f8L);//30
c = X2 (c, d, a, b, x[7], S23,0x676f02d9L);
b = X2 (b, c, d, a, x[12],S24,0x8d2a4c8aL);
a = X3 (a, b, c, d, x[5], S31,0xfffa3942L);
d = X3 (d, a, b, c, x[8], S32,0x8771f681L);
c = X3 (c, d, a, b, x[11],S33,0x6d9d6122L);
b = X3 (b, c, d, a, x[14],S34,0xfde5380cL);
a = X3 (a, b, c, d, x[1], S31,0xa4beea44L);
d = X3 (d, a, b, c, x[4], S32,0x4bdecfa9L);
c = X3 (c, d, a, b, x[7], S33,0xf6bb4b60L);
b = X3 (b, c, d, a, x[10],S34,0xbebfbc70L);//40
a = X3 (a, b, c, d, x[13],S31,0x289b7ec6L);
d = X3 (d, a, b, c, x[0], S32,0xeaa127faL);
c = X3 (c, d, a, b, x[3], S33,0xd4ef3085L);
b = X3 (b, c, d, a, x[6], S34,0x04881d05L);
a = X3 (a, b, c, d, x[9], S31,0xd9d4d039L);
d = X3 (d, a, b, c, x[12],S32,0xe6db99e5L);
c = X3 (c, d, a, b, x[15],S33,0x1fa27cf8L);
b = X3 (b, c, d, a, x[2], S34,0xc4ac5665L);
a = X4 (a, b, c, d, x[0], S41,0xf4292244L);
d = X4 (d, a, b, c, x[7], S42,0x432aff97L);//50
c = X4 (c, d, a, b, x[14],S43,0xab9423a7L);
b = X4 (b, c, d, a, x[5], S44,0xfc93a039L);
a = X4 (a, b, c, d, x[12],S41,0x655b59c3L);
d = X4 (d, a, b, c, x[3], S42,0x8f0ccc92L);
c = X4 (c, d, a, b, x[10],S43,0xffeff47dL);
b = X4 (b, c, d, a, x[1], S44,0x85845dd1L);
a = X4 (a, b, c, d, x[8], S41,0x6fa87e4fL);
d = X4 (d, a, b, c, x[15],S42,0xfe2ce6e0L);
c = X4 (c, d, a, b, x[6], S43,0xa3014314L);
b = X4 (b, c, d, a, x[13],S44,0x4e0811a1L);//60
a = X4 (a, b, c, d, x[4], S41,0xf7537e82L);
d = X4 (d, a, b, c, x[11],S42,0xbd3af235L);
c = X4 (c, d, a, b, x[2], S43,0x2ad7d2bbL);
b = X4 (b, c, d, a, x[9], S44,0xeb86d391L);
state[0]+=a;state[1]+=b;state[2]+=c;state[3]+=d;
}
void Encode(byte[] output,long[] input,int len){
int i, j;
for (i = 0, j = 0; j < len; i++, j += 4){
output[j] = (byte)(input[i] & 0xffL);
output[j+1]=(byte)((input[i]>>> 8) & 0xffL);
output[j+2]=(byte)((input[i]>>>16) & 0xffL);
output[j+3]=(byte)((input[i]>>>24) & 0xffL);
}
}
void Decode(long[] output,byte[] input,int len){
int i, j;
for (i = 0, j = 0; j < len; i++, j += 4)
output[i]=liu(input[j])|(liu(input[j+1])<<8)|
(liu(input[j+2])<<16)|(liu(input[j+3])<<24);
}
static long liu(byte b){return b<0?b&0x7F+128:b;}
static String bx(byte ib){
char[]
Digit={'0','1','2','3','4','5','6','7','8','9','a'
,'b','c','d','e','f'};
char [] ob = new char[2];
ob[0] = Digit[(ib >>> 4) & 0X0F];
ob[1] = Digit[ib & 0X0F];
return (new String(ob));
}
}
MD5验证的更多相关文章
- C#基础-MD5验证
一.前言 MD5验证主要用于更新文件功能方面,服务器告知客户端要下载哪些更新文件并提供给客户端其MD5值,客户端从服务器将更新文件下载到本地并计算下载文件的MD5值,将本地接收的MD5值与服务器提供的 ...
- python网络编程-socket上传下载文件(包括md5验证,大数据发送,粘包处理)
ftp server 1) 读取文件名 2)检查文件是否存在 3)打开文件 4)检查文件大小 5)发送文件大小给客户端 6)等客户端确认 7)开始边读边(md5计算)发数据 8)给客户端发md5 ft ...
- Python Cdn平台文件md5验证
第一步 先用脚本实现基本的md5验证 1.python如何实现文件的下载 方法一: 使用 urllib 模块提供的 urlretrieve() 函数.urlretrieve() 方法直接将远程数据下载 ...
- md5验证文件上传,确保信息传输完整一致
注:因为是公司项目,仅记录方法和思路以及可公开的代码. 最近在公司的项目中,需要实现一个上传升级包到服务器的功能: 在往服务器发送文件的时候,需要确保 文件从开始发送,到存入服务器磁盘的整个传输的过程 ...
- CAS 4.0.0RC 配置MD5验证功能
配置内容同一样,只是增加一些配置. 因为cas已经默认就支持MD5加密验证,所以只是修改一下配置就可以了. <bean id="primaryAuthenticationHandler ...
- MD5验证工具:md5sum
linux 下 shell命令 ,制作md5码 也用于软件的md5校验 MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改.MD5 全称是报文摘要算法(Message-Digest ...
- 385cc412a70eb9c6578a82ac58fce14c 教大家破解md5验证值
Md5密文破解(解密)可以说是网络攻击中的一个必不可少的环节,是工具中的一个重要"辅助工具".md5解密主要用于网络攻击,在对网站等进行入侵过程,有可能获得管理员或者其他用户的账号 ...
- C# - MD5验证
前言 本篇主要记录:VS2019 WinFrm桌面应用程序实现字符串和文件的Md5转换功能.后续系统用户登录密码保护,可采用MD5加密保存到后台数据库. 准备工作 搭建WinFrm前台界面 如下图 核 ...
- FTP-实例(Md5验证)
import socket, os, hashlib server = socket.socket() server.bind(("localhost", 9999)) serve ...
随机推荐
- 各种Js封装
获取ClassName元素 function getClass(classname,id){ if(document.getElementsByClassName){ if(id){ return $ ...
- REDHAT一总复习1 NTP更改时区,并验证时区设置是否正确
把计算机时区调整到巴哈马(这是个啥地方?听都没听过.) 使用 tzselect 进行确定时区,并进行可对话性的设置,按照对应的序号,射进去就行了. 使用:timedatectl set-timezo ...
- rpm查询命令摘要
任务 命令 显示软件包的相关信息 rpm -q -i NAME 列出软件包中含有的所有文件 rpm -q -i NAME 列出软件包中含有的配置文件 rpm -q -c NAME 列出软件包中含有的文 ...
- 使用xib封装一个view的步骤
1.新建一个xib文件描述一个view的内部结构(假设叫做SSTgCell.xib) 2.新建一个自定义的类 (自定义类需要继承自系统自带的view, 继承自哪个类, 取决于xib根对象的Class ...
- js瀑布流 原理实现揭秘 javascript 原生实现
web,js瀑布流揭秘 瀑布流再很久之前流行,可能如我一样入行晚的 ,可能就没有机会去使用.但是这个技术终究是个挺炫酷的东西,花了一个上午来研究,用原生js实现了一个,下面会附上源码,供大家解读. 说 ...
- CapsLock与ctrl的键位修改
windows下修改方式: linux下修改方式: 在用户目录下新建文档命名为keychange.sh 编辑以下内容: remove Lock = Caps_Lock remove Control = ...
- 读一篇Javascript问题贴的收获
遇到这篇文章<Javascript异步调用时,回调函数内用到了函数外的变量>,是缘于我在<难道这就是JavaScript中的"闭包">文章中遇到的问题时,B ...
- Mysql binlog 安全删除
简介: 如果你的 Mysql 搭建了主从同步 , 或者数据库开启了 log-bin 日志 , 那么随着时间的推移 , 你的数据库 data 目录下会产生大量的日志文件 shell > ll /u ...
- iOS delegate
有两个scene,分别为Scene A和Scene B.Scene A上有一个UIButton(Button A)和一个UILable(Lable A):Scene B上有一个UITextFiled( ...
- 【webGl】threejs实现一个简单的动画-弹跳的小球
在这里,我们将动态画面简称为动画(animation).正如动画片的原理一样,动画的本质是利用了人眼的视觉暂留特性,快速地变换画面,从而产生物体在运动的假象.而对于Three.js程序而言,动画的实现 ...