Java 代码的 MD5 / SHA-1 等 Hash 算法的加密

本文链接: http://blog.csdn.net/xietansheng/article/details/64129933

使用 Java 代码对 文本 或 文件 进行 MD5 / SHA-1 / SHA-256 等哈希算法进行加密(计算固定长度的哈希值):

1. 封装 Hash 工具类: HashUtils.java

package com.xiets.hash;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.security.MessageDigest;

/**
 * Hash 工具
 */
public class HashUtils {

    private static final char[] HEXES = {
            '0', '1', '2', '3',
            '4', '5', '6', '7',
            '8', '9', 'a', 'b',
            'c', 'd', 'e', 'f'
    };

    /**
     * 计算文本(byte数据)的 哈希
     *
     * 根据指定的算法加密任意长度的数据, 返回固定长度的十六进制小写哈希值
     *
     * @param data 需要加密的数据
     * @param algorithm 加密算法, 例如: MD5, SHA-1, SHA-256, SHA-512 等
     */
    public static String encrypt(byte[] data, String algorithm) throws Exception {
        // 1. 根据算法名称获实现了算法的加密实例
        MessageDigest digest = MessageDigest.getInstance(algorithm);

        // 2. 加密数据, 计算数据的哈希值
        byte[] cipher = digest.digest(data);

        // 3. 将结果转换为十六进制小写
        return bytes2Hex(cipher);
    }

    /**
     * 计算文件的哈希
     *
     * 根据指定的算法加密文件数据, 返回固定长度的十六进制小写哈希值
     *
     * @param file 需要加密的文件
     * @param algorithm 加密算法, 例如: MD5, SHA-1, SHA-256, SHA-512 等
     */
    public static String encrypt(File file, String algorithm) throws Exception {
        InputStream in = null;

        try {
            // 1. 根据算法名称获实现了算法的加密实例
            MessageDigest digest = MessageDigest.getInstance(algorithm);

            in = new FileInputStream(file);
            byte[] buf = new byte[1024];
            int len = -1;
            while ((len = in.read(buf)) != -1) {
                // 2. 文件数据通常比较大, 使用 update() 方法逐步添加
                digest.update(buf, 0, len);
            }

            // 3. 计算数据的哈希值, 添加完数据后 digest() 方法只能被调用一次
            byte[] cipher = digest.digest();

            // 4. 将结果转换为十六进制小写
            return bytes2Hex(cipher);

        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (Exception e) {
                    // nothing
                }
            }
        }
    }

    /**
     * byte数组转换为 16 进制数据
     */
    private static String bytes2Hex(byte[] bytes) {
        if (bytes == null || bytes.length == 0) {
            return null;
        }

        StringBuilder sb = new StringBuilder();

        for (byte b : bytes) {
            sb.append(HEXES[(b >> 4) & 0x0F]);
            sb.append(HEXES[b & 0x0F]);
        }

        return sb.toString();
    }

}

工具类使用示例:

  • 计算文本哈希值:HashUtils.encrypt(text.getBytes("UTF-8"), "MD5/SHA-1/SHA-256")
  • 计算文件哈希值:HashUtils.encrypt(file, "MD5/SHA-1/SHA-256");

2. 代码实例

package com.xiets.hash;

import java.io.File;

public class Main {

    public static void main(String[] args) throws Exception {
        // 计算文本的 MD5 和 SHA-1
        String text = "Hello World!";
        String md5 = HashUtils.encrypt(text.getBytes("UTF-8"), "MD5");
        String sha1 = HashUtils.encrypt(text.getBytes("UTF-8"), "SHA-1");
        System.out.println(text + ": MD5 = " + md5 + ", SHA-1 = " + sha1);

        // 计算文件的 MD5
        String fileMd5 = HashUtils.encrypt(new File("demo.jpg"), "MD5");
        System.out.println("File MD5 = " + fileMd5);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谢TS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值