消息摘要是数据信息的数字指纹。通过某种安全散列算法(如SHA1)对数据信息进行加密,就可以生成一个20字节(MD5算法好像是16字节)的序列,这个序列就称为消息摘要。
从安全的角度考虑,我们总是希望任何不同的数据信息都生成不同的消息摘要,但这是不可能的,就拿SHA1算法来说,消息摘要是一个20字节的序列,也就是160位的长度,一共也只有2的160次方种可能。但这已经是一个巨大的数字了,我们可以相信两个不同的数据信息总是生成不同的消息摘要。
所以,消息摘要具有以下两个特点:
- 如果数据信息改变了,那么消息也将根着改变;
- 伪造者无法创建与原数据信息具有相同消息摘要的假数据信息。
消息摘要在网络中怎样起到安全的作用呢?假设你要发送下面一段数据信息给你的朋友:
晚上一起吃饭
你可以先生成这段数据信息的消息摘要,上面的信息用SHA1算法加密后就复到下面的消息摘要:
fa00078d5bd477e6d397dd5f7f11166a
之后你就可以把数据和摘要分别发送给你的朋友,然后你朋友也对数据信息进行加密,并把加密生成的摘要与你发送给他的进行对比,如果一样的,那么你朋友就可以确定数据信息在传输过程中没有被别人修改过。
当然,仅仅是靠消息摘要,还无法解决所有的安全问题,比如数据和摘要在传输过程中同时被别人窃取了,你的朋友无法保正数据是不是真的来自于你,等等。后面的文章,我们接着介绍如果通过别的方法(比如公共密钥)来解决其它的安全问题。
下面我们来看看在Java中如何对数据进行SHA1算法或MD5算法加密。其实Java语言已经实现了这两个算法,那就是java.security包下的MessageDigest类。具体的代码网上很容易搜到现在的代码:
public static String encodePassword(byte[] data, String algorithm)
throws NoSuchAlgorithmException
{
MessageDigest md = MessageDigest.getInstance(algorithm);
md.reset();
md.update(data);
byte[] rlt = md.digest();
StringBuffer buf = new StringBuffer();
for (int i = 0; i < rlt.length; i++)
{
if ((rlt[i] & 0xff) < 0x10)
{
buf.append("0");
}
buf.append(Integer.toHexString(rlt[i] & 0xff));
}
return buf.toString();
}
首先通过MessageDigest类的getInstance(String)方法获得该类的一个实例,具体的算法通过参数指定,比如"SHA-1"或"MD5",reset()方法用于复位摘要,update方法以字节数组的方式指定要加密的数据信息,接着调用digest()方法就生成了消息摘要。
比较有意思的是后面for块里面的代码,我第一次看这段代码的时候也是花了点功夫才弄明白。
后面这部分代码的作用是把byte[]格式的摘要转换成16进制的字符串。在Java中,byte占有8个位,转换成16进制的话,也就是2位,所以当这个byte小于16的话,要在前面加一个0。比如2进制数00001111,应该是转换成0f,但如果直接调用Integer.toHexString(15)的话,返回的结果是f而不是0f。这就是为什么上面if后面要做<0x10的判断了。
另外一个比较难懂的地方就是rlt[i] & 0xff了。这里的与操作,目的很简单,就是把byte正确的转型为int,因为toHexString(int)方法只能接受int类型的参数。如果我们不做这个与操作,某些情况下转型过后的值就可能不是我们想要的值,比如-1的字节码(补码,Java以补码的形式表示数值)为
1111 1111
转型为int后的字节码是
1111 1111 1111 1111 1111 1111 1111 1111
而在这里我们需要的值是
0000 0000 0000 0000 0000 0000 1111 1111
所以这里用rit[i]和0xff做了一个与运算,就能得到我们想要的值了。
分享到:
相关推荐
MD5 jar包是用java编写的一个实现网络安全中的md5散列算法的第三方包。我自己在实习的时候编写的
java安全代码下载
利用java编程实现网络安全通信.pdf
阿里巴巴最具价值的安全专家吴翰清的《白帽子讲Web安全》 以思维导图模式概况了本书的最主要内容,值得学习。
Java安全是指在Java编程和应用开发过程中采取的一系列措施,旨在保护Java应用程序、系统和数据免受恶意攻击、数据泄露和其他安全威胁的影响。Java安全主要涉及以下几个方面: 代码安全性:Java提供了强大的安全机制...
java网络编程包括socket tcp/udp io/nio讲解 http协议 jdbc rmi java的安全框架等知识
JAVA制作一个网络安全传输工具-源代码
基于Java编程提高网络通信安全问题研究.pdf
网络安全_基于Java开发的网络安全Ipv6抓包项目
本书第1-3章介绍了网络进程通信的主要技术。其中,第1章介绍网络进程通信的基础类...本书可作为高校计算机应用、网络信息、电子商务技术等专业级学生及研究生的教材,也可以作为Java网络编程爱好者的自学参考书。
无论你是经验丰富的网络开发人员、Java程序员新手,还是只希望对Java网络编程稍有些了解的人,都会发现《Java编程(第三版)》将成为你的书库中一个重要的部分。一旦开始使用Java网络API,只要你能想到它就能够做...
java2 的网络安全 java2 的网络安全介绍和说明
这个代码实现了一个简单的文件加密系统。首先定义了一个AES算法和一个密钥值,然后通过Cipher类和SecretKeySpec类生成了一个密钥对象。在encryptFile方法中,读取输入文件的内容,使用密钥对象对内容进行加密,并将...
基于Java平台安全性的分析与研究.pdf
java安全性编程实例讲解 网络应用技术(java)
浅析java的网络安全加密技术.doc
Java安全性编程示例(含源码),讲得很详细,推荐使用~~~~
Web应用的网络安全漏洞层出不穷,用户的隐私和数据等信息安全...反序列化漏洞因其利用门槛低、影响范围广的特点,已成影响java Web网络安全重要因素之一。文章结合实例分析了java Web反序列漏洞的特点,阐述了java Web...
计算机网络安全编程局域聊天c++语言chat.vbw
这是本人在2009年5月做的一个带即时聊天,文件传输,网上虚拟购物的程序,但更重要的事,是对这些功能加载网络安全功能的实现,主要有加密解密,数字签名,哈稀,并且对一些攻击(如replay attack)的防范。用JAVA ...