主页 > imtoken国际版 > SHA1加密算法(java实现)

SHA1加密算法(java实现)

imtoken国际版 2023-06-09 05:55:30

SHA1加密算法

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 适用于长度不超过 2^64 二进制位的消息。 SHA-384 和 SHA-512 适用于长度不超过 2^128 个二进制位的消息。

算法原理

SHA-1 是一种数据加密算法。 该算法的思想是接收一段明文,并以不可逆的方式将其转换成一段(通常更小的)密文。 也可以简单理解为取一串输入编码(称为预映射或信息),将其转化为长度较短、固定位数的输出序列,即哈希值(也称为消息摘要)或消息验证码)。

单向哈希函数的安全性在于生成哈希值的运算过程具有很强的单向性。 如果在输入序列中嵌入密码,则在不知道密码的情况下,任何人都无法生成正确的哈希值,从而保证了其安全性。 SHA 将输入流分成 512 位(64 字节)的块,并生成称为消息验证码或消息摘要的 20 字节输出。

该算法的输入消息长度不受限制,并生成 160 位消息摘要作为输出。 输入以 512 位为一组进行处理。 SHA-1不可逆、防碰撞、具有良好的雪崩效应。

数字签名可以通过哈希算法实现。 数字签名的原理是将要传输的明文通过函数运算(Hash)转换成消息摘要(不同的明文对应不同的消息摘要)比特币密钥长度多少位,消息摘要用加密后的明文发送给接收方一起,接收方从收到的明文生成一个新的消息摘要,并将其与发送方发送的解密消息摘要进行比较。 如果比较结果一致,说明明文没有被改变。 如果不一致,说明明文被篡改了。

Java中的算法实现

public class SecuritySHA1Utils {
    /**
     * @Comment SHA1实现
     * @Author Ron
     * @Date 2017年9月13日 下午3:30:36
     * @return
     */
    public static String shaEncode(String inStr) throws Exception {
        MessageDigest sha = null;
        try {
            sha = MessageDigest.getInstance("SHA");
        } catch (Exception e) {
            System.out.println(e.toString());
            e.printStackTrace();
            return "";
        }
        byte[] byteArray = inStr.getBytes("UTF-8");
        byte[] md5Bytes = sha.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();
    }
    public static void main(String args[]) throws Exception {
        String str = new String("amigoxiexiexingxing");
        System.out.println("原始:" + str);
        System.out.println("SHA后:" + shaEncode(str));
    }
}

但在实际应用中,我们可以直接导入org.apache.commons.codec.digest.DigestUtils,然后调用加密如下。

/**
* @Comment SHA1加密密码
* @Author Ron
* @Date 2017年9月12日 下午2:46:31
* @return
*/
public static String encodePassword(String psw) {
    if(StringUtils.isEmpty(psw)){
        return null;
    }else{
        return DigestUtils.sha1Hex(psw);
    }
} 

原文地址:7.SHA1加密算法_Ron.Zheng-CSDN博客_sha1加密