首页 > Java > 数据加密算法之MD5和SHA1

数据加密算法之MD5和SHA1

2014年12月21日 发表评论 阅读评论

这个星期记录一下数据加密算法,记得刚开始学编程的时候就有一个疑问:我们的密码就这么放在数据库里面,多不安全啊,数据库管理员不是拿着数据想干嘛就干嘛吗?但是由于认知有限,一直没有解决这个问题,直到去年实习时,当时的项目经理Zack说,用户密码不能明文存放到数据,必须经过MD5加密,终于解决了这个问题。因为MD5的不可逆性,所以就算知道MD5码,只要你不是一些弱密码,一般情况下发生泄密的可能性是非常非常小的,几乎可以认为是绝对安全的,但MD5实现的实现却很简单,今天就记录一下实习时用到的一个MD5加密算法的一个实现:


package cn.bridgeli.demo;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Encryption {

    public static String MD5(String input) {
        StringBuffer hexString = null;
        try {
            // 获得MD5摘要算法的 MessageDigest 对象
            MessageDigest mdInst = MessageDigest.getInstance("MD5");
            // 使用指定的字节更新摘要
            mdInst.update(input.getBytes());
            // 获得密文
            byte[] md = mdInst.digest();
            // 把密文转换成十六进制的字符串形式
            hexString = new StringBuffer();
            // 字节数组转换为 十六进制 数
            for (int i = 0; i < md.length; i++) {
                String shaHex = Integer.toHexString(md[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexString.append(0);
                }
                hexString.append(shaHex);
            }

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return hexString.toString();
    }

    public static String SHA1(String decript) {
        StringBuffer hexString = null;
        try {
            MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");
            digest.update(decript.getBytes());
            byte messageDigest[] = digest.digest();
            // Create Hex String
            hexString = new StringBuffer();
            // 字节数组转换为 十六进制 数
            for (int i = 0; i < messageDigest.length; i++) {
                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexString.append(0);
                }
                hexString.append(shaHex);
            }

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return hexString.toString();
    }
}

这里面还有一个SHA1机密算法的实现,主要是在自学微信开发时,微信在接入验证的数据经过字典排序后SHA1加密,所以就顺便记录了一下,算是两个比较常用的加密算法吧,供大家参考。

PS:1. 因为MD5加密之后的数据是32位的,所以在设计数据库密码那一栏的长度肯定是32,短了不够用,长了资源浪费;
2. MD5的应用非常广泛,用于密码加密只是一个小应用,在我们的生活中被广泛应用,例如我们在下载一些软件时,很多在旁边都标注有MD5的值,因为MD5之后是唯一的,所以我们可以在网上找一个MD5校验器,看看这个文件的MD5值,看和官网上给出的MD5是否一致,如果一致那么这个文件就没有被人修改过,那么这个文件就可以被认为是安全的,否则就有可能被别人动过手脚了,这时你就要小心了。

分享到:
作 者: BridgeLi,http://www.bridgeli.cn/
原文链接:https://www.bridgeli.cn/archives/128
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
分类: Java 标签: ,
  1. zhuan
    2014年12月22日22:26 | #1

    你应该把MD5的算法内容讲一下,这样单纯的调用还是不明白原理。

    • Bridge Li
      2014年12月23日10:04 | #2

      嗯,是的,谢谢你的建议,其实这主要是我个人的学习笔记,还是想以实用为主,有些东西将来用到了可以直接拿来用就是了;等将来水平了上来了,会考虑写一些原理性的文章

  1. 本文目前尚无任何 trackbacks 和 pingbacks.