java加密解密——单项加密之MD5(算法)

来源:互联网 发布:mysql insert 锁表 编辑:程序博客网 时间:2024/06/05 15:54

密码学在加密算法上大体可分为单向加密算法、对称加密算法、非对称加密算法。
MD5、SHA是单向加密算法的代表,单向加密算法是数据完整性验证的常用算法。DES是典型的对称加密算法的代表,对称加密算法是数据存数加密的常用算法。RSA算法是非对称加密算法的代表,非对称加密算法是数据传输加密的常用算法。
单向加密算法—–散列函数
单向加密算法主要用于对信息完整性的验证,这种技术就是由散列函数提供的消息认证技术。
散列函数,也称做哈希函数、消息摘要函数、单向函数或杂凑函数。通过散列函数,可以为数据创建“数字指纹”(散列值)。散列值通常是一个字母和数字组成的字符串。
其消息认证流程如下:
这里写图片描述
在上述认证流程中,信息收发双方在通信前已经商定了具体的散列算法,并且该算法是公开的。如果消息在传递过程中被篡改,则该消息不能与已获得的数字指纹相匹配。
散列函数具有以下的特征:
1、消息的长度不受限制
2、对于给定的消息,其散列值的计算是很容易的。
3、如果两个散列值不相同,则这两个散列值的原始输入消息也不相同,这个特性使得散列函数具有确定性的结果。
4、散列函数的运算过程是不可逆的,这个特性称为函数的单向性。这也是单向函数命名的由来。
5、对于一个已知的消息及散列值,要找到另一个消息使其获得相同的散列值是可不能的。这个特性称为抗弱碰撞性。这被用来防止伪造。
6、任意两个不同消息的散列值一定不同。这个特性称为抗强碰撞性。
散列函数广泛用于信息完整性的验证,是数据签名的核心技术,散列函数的常用算法有MD—-消息摘要算法、SHA—–安全散列算法及MAC—–消息认证码算法。

MD5应用场景及Java实现

(http://blog.csdn.net/bestdatas/article/details/52942535):

A.一致性验证

MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的“数字指纹”,如果任何人对文件做了任何改动,其MD5值也就是对应的“数字指纹”都会发生变化。

B.数字签名

MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫
readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。

C.安全访问认证

MD5还广泛用于操作系统的登陆认证上,如Unix、各类BSD系统登录密码、数字签名等诸多方面。如在Unix系统中用户的密码是以MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行MD5
Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。

MD5的java工具实现

package utils;import java.security.MessageDigest;/** * MD5工具类. * @author libaobao * */public class MD5Utils {    private String inStr;    private MessageDigest md5;    public MD5Utils(String inStr) {        this.inStr = inStr;        try {            this.md5 = MessageDigest.getInstance("MD5");        } catch (Exception e) {            System.out.println(e.toString());            e.printStackTrace();        }    }    /**     * 计算一个字符串对于的MD5串     * @return MD5c串     */    public String compute() {        char[] charArray = this.inStr.toCharArray();        byte[] byteArray = new byte[charArray.length];        for (int i = 0; i < charArray.length; i++)            byteArray[i] = (byte) charArray[i];        byte[] md5Bytes = this.md5.digest(byteArray);        StringBuffer hexValue = new StringBuffer();        for (int i = 0; i < md5Bytes.length; i++) {            int val = ((int) md5Bytes[i]) & 0xff;            if (val < 16)                hexValue.append("0");            hexValue.append(Integer.toHexString(val));        }        return hexValue.toString();    }    /**     * @param args     */    public static void main(String[] args) {        MD5Utils md5 = new MD5Utils("123456");        String postString = md5.compute();        System.out.println("加密后的字符:" + postString);    }}

SHA(Secure Hash Algorithm:安全散列算法)

SHA, 数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了, 但是SHA仍然是公认的安全加密算法,较之MD5更为安全。
SHA和MD5

package utils;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class EncrypSHA {    public byte[] eccrypt(String info) throws NoSuchAlgorithmException{        MessageDigest md5 = MessageDigest.getInstance("SHA");        byte[] srcBytes = info.getBytes();        //使用srcBytes更新摘要        md5.update(srcBytes);        //完成哈希计算,得到result        byte[] resultBytes = md5.digest();        return resultBytes;    }    /**     * @param args     * @throws NoSuchAlgorithmException      */    public static void main(String[] args) throws NoSuchAlgorithmException {        String msg = "李宝宝";        EncrypSHA sha = new EncrypSHA();        byte[] resultBytes = sha.eccrypt(msg);        System.out.println("明文是:" + msg);        System.out.println("密文是:" + new String(resultBytes));    }}
原创粉丝点击