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 ...
随机推荐
- AJAX请求时status返回状态明细表 readyState的五种状态
在<Pragmatic Ajax A Web 2.0 Primer >中偶然看到对readyStae状态的介绍,感觉这个介绍很实在,摘译如下: 0: (Uninitialized) the ...
- Myeclipse 构建工作空间出错
MyEclipse工作空间报错如下:'Building workspace' has encountered a problem. Errors occurred during the build.并 ...
- iOS优秀博客收录
原文链接:http://ju.outofmemory.cn/entry/105297 唐巧 王巍 破船之家 NSHipster Limboy 无网不剩 念茜的博客 Xcode Dev Ted's Ho ...
- ObjC运行时部分概念解析(一)
转型iOS已经许久了,Runtime(运行时)还没有好好了解过.之前没有阅读过源码,紧紧凭借自己的臆测.现在阅读下源码,做一些笔记.方便再次翻阅 SEL SEL是一个关键字,如果没有涉及runtime ...
- C和指针 第十五章 输入输出缓冲
对于C,所有的I/O操作都只是简单的从程序移进或移出字节,这种字节流便成为流(stream),我们需要关心的只是创建正确的输出字节数据,以及正确的输入读取数据,特定的I/O设备细节都是对程序隐藏的. ...
- 使用php+swoole对client数据实时更新(下)
上一篇提到了swoole的基本使用,现在通过几行基本的语句来实现比较复杂的逻辑操作: 先说一下业务场景.我们目前的大多数应用都是以服务端+接口+客户端的方式去协调工作的,这样的好处在于不论是处在何种终 ...
- 【Android自学日记】两种适配器的使用
ArrayAdapter适配器: (1)用于显示基本的文字内容 (2)基本使用过程:新建适配器---创建或加载数据源---适配器加载数据源---视图加载适配器 ArrayAdapter(上下文,当前L ...
- [ActiveMQ]初识ActiveMQ
初识ActiveMQ ActiveMQ介绍 官方网站:http://activemq.apache.org/ 最新版本:ActiveMQ 5.14.1(2016-10-28) 最新版本下载链接:htt ...
- 学习 opencv---(5) 创建Trackbar(活动条) &图像对比度,亮度值调整
学习如何在opencv 中用trackbar 函数创建和使用 轨迹条,以及图像对比度,亮度值的动态调整 一.OpenCV中轨迹条(Trackbar)的创建和使用 [1]创建轨迹条-----create ...
- r-cnn学习(九):学习总结
首先看下代码文件夹的说明(这部分转自:http://blog.csdn.net/bailufeiyan/article/details/50749694) tools 在tools文件夹中,是我们直接 ...