Java 常用加密算法(一)---单向加密算法(MD5/SHA)

  1. MD5加密

    MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
    在MD5算法中,首先需要对信息进行填充,使其位长对512求余的结果等于448。因此,信息的位长(Bits Length)将被扩展至N512+448,N为一个非负整数,N可以是零。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,信息的位长=N512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。

/**
 * MD5 加密工具类
 * @author mazaiting
 */
public class Md5Util {
    
    /**
     * MD5 加密 生成32位MD5码
     * @param source 需要加密的字符串
     * @return 32位MD5码
     */
    public static String encode(String source) {
        try {
            // 获得MD5 消息摘要
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            // 获得指定编码的字节数据
            byte[] sourceBytes = source.getBytes("UTF-8");
            // 指定的字节数组对摘要执行最终更新
            byte[] digestBytes = messageDigest.digest(sourceBytes);
            StringBuffer hexValue = new StringBuffer();
            
            for (int i = 0; i < digestBytes.length; i++) {
                int val = (digestBytes[i] & 0xff);
                if (val < 16){
                    hexValue.append("0");
                }
                hexValue.append(Integer.toHexString(val));
            }
            
            return hexValue.toString(); 
        } catch (NoSuchAlgorithmException e) {
            return null;// 获得MD5 消息摘要异常
        } catch (UnsupportedEncodingException e) {
            return null;// 获得指定编码的字节数据异常
        }       
    }
    
}
  1. SHA
    SHA是一种数据加密算法,该算法经过加密专家多年来的发展和改进已日益完善,现在已成为公认的最安全的散列算法之一,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。
    安全散列算法SHA(Secure Hash Algorithm,SHA)是美国国家标准技术研究所发布的国家标准FIPS PUB 180,最新的标准已经于2008年更新到FIPS PUB 180-3。其中规定了SHA-1,SHA-224,SHA-256,SHA-384,和SHA-512这几种单向散列算法。SHA-1,SHA-224和SHA-256适用于长度不超过264二进制位的消息。SHA-384和SHA-512适用于长度不超过2128二进制位的消息。

/**
 * 采用SHA 加密
 * @author mazaiting
 */
public class SHAUtil {
    /**
     * SHA 加密 生成40位SHA码
     * @param source 待加密字符串
     * @return 返回40位SHA码
     */
    public static String encode(String source) {
        try {
            // 获取SHA的消息摘要
            MessageDigest messageDigest = MessageDigest.getInstance("SHA");
            // 获取指定编码的字符串字节数组
            byte[] sourceBytes = source.getBytes("UTF-8");
            // 对指定字节数据进行更新
            byte[] digestBytes = messageDigest.digest(sourceBytes);
                
            StringBuffer hexValue = new StringBuffer();
            for (int i = 0; i < digestBytes.length; i++) {
                int val = (digestBytes[i] & 0xff);
                if (val < 16) {
                    hexValue.append("0");
                }
                hexValue.append(Integer.toHexString(val));
            }
            
            return hexValue.toString();
        } catch (NoSuchAlgorithmException e) {
            return null;// 获取SHA的消息摘要异常
        } catch (UnsupportedEncodingException e) {
            return null;// 获取指定编码的字符串字节数组失败
        }       
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这篇文章主要讲述在Mobile BI(移动商务智能)开发过程中,在网络通信、数据存储、登录验证这几个方面涉及的加密...
    雨_树阅读 2,638评论 0 6
  • 在开发应用过程中,客户端与服务端经常需要进行数据传输,涉及到重要隐私安全信息时,开发者自然会想到对其进行加密,即使...
    闲庭阅读 3,294评论 0 11
  • 版本记录 前言 在这个信息爆炸的年代,特别是一些敏感的行业,比如金融业和银行卡相关等等,这都对app的安全机制有更...
    刀客传奇阅读 1,772评论 0 2
  • 本文主要介绍移动端的加解密算法的分类、其优缺点特性及应用,帮助读者由浅入深地了解和选择加解密算法。文中会包含算法的...
    苹果粉阅读 11,567评论 5 29
  • 处理问题的步骤: 1.遇到问题先理解对方所说的问题以及想要的效果。当我们听懂了对方的问题和想要做的东西的时候,我们...
    喜相逢v5阅读 326评论 0 1