注意:本节内容主要参考自《Java加密与解密的艺术(第2版)》第6章“验证数据完整性--消息摘要算法”

4.1、SHA

原理:消息摘要长度(可以定量为加密后的字符串的长度)越长,安全性越高

  • MD5:128位二进制摘要(32位16进制字符串)(已破解)
  • SHA1:160位二进制摘要(40位16进制字符串)(已破解)
  • SHA256:256位二进制摘要(64位16进制字符串)(常用,在spring security中也有使用到)

实现方式:

  • Commons Codec(“CC”,最推荐,因为封装了JDK的底层代码,并且提供了二进制字节数组向十六进制转化的方法)
  • JDK(没有提供二进制字节数组向十六进制转化的方法,想要进行转化,需要借助BC)
  • Bouncy Castle(“BC”,不推荐,实现比较复杂)

下边只列出基于CC的工具类代码,至于基于JDK的代码可以参考“《Java加密与解密的艺术(第2版)》”,基于BC的代码可参考“慕课网”

4.1.1、基于CC的SHA加密算法

package com.util.sha;

import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.codec.digest.DigestUtils;
/**
 * 基于Commons Codec的SHA算法
 */
public class SHACC {
    private static final String ENCODING = "UTF-8";

    /**
     * SHA加密,加密后的结果为二进制字节数组
     */
    public static byte[] encode(String data) throws NoSuchAlgorithmException,UnsupportedEncodingException {
        //return DigestUtils.sha1(data.getBytes(ENCODING));//SHA-1
        return DigestUtils.sha256(data.getBytes(ENCODING));//SHA-256
    }

    /**
     *SHA加密,加密后的结果为二进制字节数组,并且在这里将二进制字节数组转为了16进制字符串
     */
    public static String encodeSHAHex(String data) throws NoSuchAlgorithmException,UnsupportedEncodingException {
        //return new String(DigestUtils.sha1Hex(data.getBytes(ENCODING)));
        return new String(DigestUtils.sha256Hex(data.getBytes(ENCODING)));
    }

    /**
     * 测试
     * @param args
     * @throws UnsupportedEncodingException
     * @throws NoSuchAlgorithmException
     */
    public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException {

        String data = "找一个好姑娘做老婆是我的梦 想!";
        /*************测试encode()**************/
        System.out.println("原文-->"+data);
        byte[] encodedByte = SHACC.encode(data);
        System.out.println("加密后-->"+encodedByte);
        byte[] encodedByte2 = SHACC.encode(data);
        System.out.println("加密后-->"+encodedByte2);
        for(int i=0;i<encodedByte.length;i++){
            System.out.println(encodedByte[i]==encodedByte2[i]);
        }
        /*************测试encodeSHAHex()**************/
        System.out.println("原文-->"+data);
        String encodedStr = SHACC.encodeSHAHex(data);
        System.out.println("加密后-->"+encodedStr);
        String encodedStr2 = SHACC.encodeSHAHex(data);
        System.out.println("加密后-->"+encodedStr2);
        System.out.println(encodedStr.equals(encodedStr2));
    }
}

在我们需要采用相应的sha算法的时候,只需选用不同的函数即可(具体查询Commons Codec的API即可,链接在第五章末尾)。

jar包的引入参考第二章的第一个例子进行即可,在测试的过程中,自己去试着看看“同一个消息多次进行SHA加密后结果是不是相同”;

在encode()方法的测试中判断两个byte[]是否相等:按索引依次比较两个字节数组中的元素是否相同即可(如果使用main方法去测的话);如果使用Junit,直接使用assertArrayEquals(array1,array2)即可。

最新文章

  1. html5 拖拽函数1--不兼容火狐
  2. 深入浅出Alljoyn——实例分析之远程调用(Method)篇
  3. .Net 转战 Android 4.4 日常笔记(3)--目录结构分析
  4. MySQL环境部署
  5. 北大poj-1081
  6. 夯实基础之php学习-2提高篇
  7. ACM blockhouses
  8. 【转】移动Web单页应用开发实践——页面结构化
  9. Servlet加载器的实验
  10. ssh命令:使用密钥文件进行登陆
  11. 在EF的code frist下写稳健的权限管理系统:数据库模型(二)
  12. Linux下安装Websphere MB所需的系统rpm包
  13. php错误消息捕获
  14. PHP字符串操作汇总
  15. 区别typedef和#define
  16. iOS: 学习笔记实例, 用代码控制视图创建与切换
  17. hdu 3635 Dragon Balls(并查集应用)
  18. Java程序员们最常犯的10个错误(转)
  19. win10想开测试模式,提示“设置元素数据时出错
  20. Python在金融量开源项目列表

热门文章

  1. Java——文件操作字符流和字节流的区别
  2. linux平台mysql密码设破解
  3. glide从入门到精通使用
  4. 字母统计-map
  5. Andrew Ng-ML-第十八章-大规模机器学习
  6. [LeetCode] 58. Length of Last Word_Easy tag: String
  7. 2018-2019-2 网络对抗技术 20165324 Exp3:免杀原理与实践
  8. Leetcode: Binary Tree Inorder Transversal
  9. linux cut字符串切割
  10. zw版【转发&#183;台湾nvp系列Delphi例程】HALCON SigmaImage1