GVKun编程网logo

MD5&SHA 加密 util 类(Java)(md5加密java代码)

2

对于MD5&SHA加密util类感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解Java,并且为您提供关于BASE64、MD5、SHA、HMAC几种加密算法、C#MD5与javaMD5生成的

对于MD5&SHA 加密 util 类感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解Java,并且为您提供关于BASE64、MD5、SHA、HMAC几种加密算法、C# MD5 与 java MD5 生成的字符串不一致问题、C# 计算字符串的哈希值(MD5、SHA)、C#SHA-256与Java SHA-256.结果不同?的宝贵知识。

本文目录一览:

MD5&SHA 加密 util 类(Java)(md5加密java代码)

MD5&SHA 加密 util 类(Java)(md5加密java代码)

 MD5&SHA 加密 util 类(Java)

  1. package com.arui.util;  
  2. import java.security.MessageDigest;  
  3. import java.security.NoSuchAlgorithmException;  
  4. public class EncryptUtils {  
  5.     /** 
  6.      * Encrypt string using MD5 algorithm 
  7.      */  
  8.     public final static String encryptMD5(String source) {  
  9.         if (source == null) {  
  10.             source = "";  
  11.         }  
  12.         String result = "";  
  13.         try {  
  14.             result = encrypt(source, "MD5");  
  15.         } catch (NoSuchAlgorithmException ex) {  
  16.             // this should never happen  
  17.             throw new RuntimeException(ex);  
  18.         }  
  19.         return result;  
  20.     }  
  21.     /** 
  22.      * Encrypt string using SHA algorithm 
  23.      */  
  24.     public final static String encryptSHA(String source) {  
  25.         if (source == null) {  
  26.             source = "";  
  27.         }  
  28.         String result = "";  
  29.         try {  
  30.             result = encrypt(source, "SHA");  
  31.         } catch (NoSuchAlgorithmException ex) {  
  32.             // this should never happen  
  33.             throw new RuntimeException(ex);  
  34.         }  
  35.         return result;  
  36.     }  
  37.     /** 
  38.      * Encrypt string 
  39.      */  
  40.     private final static String encrypt(String source, String algorithm)  
  41.             throws NoSuchAlgorithmException {  
  42.         byte[] resByteArray = encrypt(source.getBytes(), algorithm);  
  43.         return toHexString(resByteArray);  
  44.     }  
  45.     /** 
  46.      * Encrypt byte array. 
  47.      */  
  48.     private final static byte[] encrypt(byte[] source, String algorithm)  
  49.             throws NoSuchAlgorithmException {  
  50.         MessageDigest md = MessageDigest.getInstance(algorithm);  
  51.         md.reset();  
  52.         md.update(source);  
  53.         return md.digest();  
  54.     }  
  55.     /** 
  56.      * Get hex string from byte array 
  57.      */  
  58.     private final static String toHexString(byte[] res) {  
  59.         StringBuffer sb = new StringBuffer(res.length << 1);  
  60.         for (int i = 0; i < res.length; i++) {  
  61.             String digit = Integer.toHexString(0xFF & res[i]);  
  62.             if (digit.length() == 1) {  
  63.                 digit = ''0'' + digit;  
  64.             }  
  65.             sb.append(digit);  
  66.         }  
  67.         return sb.toString().toUpperCase();  
  68.     }  
  69. }  
 



原文链接: http://blog.csdn.net/arui319/article/details/5771804

BASE64、MD5、SHA、HMAC几种加密算法

BASE64、MD5、SHA、HMAC几种加密算法

本篇内容简要介绍BASE64、MD5、SHA、HMAC几种加密算法。
    BASE64编码算法不算是真正的加密算法。
    MD5、SHA、HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法,我们称之为单向加密算法。我们通常只把他们作为加密的基础。单纯的以上三种的加密并不可靠。 

BASE64 
按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.) 
常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。 

如基本的单向加密算法: 

  • BASE64 严格地说,属于编码格式,而非加密算法

  • MD5(Message Digest algorithm 5,信息摘要算法)

  • SHA(Secure Hash Algorithm,安全散列算法)

  • HMAC(Hash Message Authentication Code,散列消息鉴别码)


    复杂的对称加密(DES、PBE)、非对称加密算法: 

  • DES(Data Encryption Standard,数据加密算法)

  • PBE(Password-based encryption,基于密码验证)

  • RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)

  • DH(Diffie-Hellman算法,密钥一致协议)

  • DSA(Digital Signature Algorithm,数字签名)

  • ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)



    本篇内容简要介绍BASE64、MD5、SHA、HMAC、DES、PBE、RSA几种方法。 

    MD5、SHA、HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法。我们通常只把他们作为加密的基础。单纯的以上三种的加密并不可靠。


通过java代码实现如下:

  1. /** 
  2.  * BASE64解密 
  3.  *  
  4.  * @param key 
  5.  * @return 
  6.  * @throws Exception 
  7.  */  
  8. public static byte[] decryptBASE64(String key) throws Exception {  
  9.     return (new BASE64Decoder()).decodeBuffer(key);  
  10. }  
  11.   
  12. /** 
  13.  * BASE64加密 
  14.  *  
  15.  * @param key 
  16.  * @return 
  17.  * @throws Exception 
  18.  */  
  19. public static String encryptBASE64(byte[] key) throws Exception {  
  20.     return (new BASE64Encoder()).encodeBuffer(key);  
  21. }  


主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。另,BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。

MD5
MD5 -- message-digest algorithm 5 (信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值。好比现在的ISO校验,都是MD5校验。怎么用?当然是把ISO经过MD5后产生MD5的值。一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。就是用来验证文件是否一致的。



通过java代码实现如下:

  1. /** 
  2.  * MD5加密 
  3.  *  
  4.  * @param data 
  5.  * @return 
  6.  * @throws Exception 
  7.  */  
  8. public static byte[] encryptMD5(byte[] data) throws Exception {  
  9.   
  10.     MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);  
  11.     md5.update(data);  
  12.   
  13.     return md5.digest();  
  14.   
  15. }  



通常我们不直接使用上述MD5加密。通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串。

SHA
SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了, 但是SHA仍然是公认的安全加密算法,较之MD5更为安全。



通过java代码实现如下:

  1.     /** 
  2.      * SHA加密 
  3.      *  
  4.      * @param data 
  5.      * @return 
  6.      * @throws Exception 
  7.      */  
  8.     public static byte[] encryptSHA(byte[] data) throws Exception {  
  9.   
  10.         MessageDigest sha = MessageDigest.getInstance(KEY_SHA);  
  11.         sha.update(data);  
  12.   
  13.         return sha.digest();  
  14.   
  15.     }  
  16. }  



HMAC
HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。



通过java代码实现如下:

  1. /** 
  2.  * 初始化HMAC密钥 
  3.  *  
  4.  * @return 
  5.  * @throws Exception 
  6.  */  
  7. public static String initMacKey() throws Exception {  
  8.     KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);  
  9.   
  10.     SecretKey secretKey = keyGenerator.generateKey();  
  11.     return encryptBASE64(secretKey.getEncoded());  
  12. }  
  13.   
  14. /** 
  15.  * HMAC加密 
  16.  *  
  17.  * @param data 
  18.  * @param key 
  19.  * @return 
  20.  * @throws Exception 
  21.  */  
  22. public static byte[] encryptHMAC(byte[] data, String key) throws Exception {  
  23.   
  24.     SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);  
  25.     Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
  26.     mac.init(secretKey);  
  27.   
  28.     return mac.doFinal(data);  
  29.   
  30. }  



给出一个完整类,如下:

  1. import java.security.MessageDigest;  
  2.   
  3. import javax.crypto.KeyGenerator;  
  4. import javax.crypto.Mac;  
  5. import javax.crypto.SecretKey;  
  6.   
  7. import sun.misc.BASE64Decoder;  
  8. import sun.misc.BASE64Encoder;  
  9.   
  10. /** 
  11.  * 基础加密组件 
  12.  *  
  13.  * @author 梁栋 
  14.  * @version 1.0 
  15.  * @since 1.0 
  16.  */  
  17. public abstract class Coder {  
  18.     public static final String KEY_SHA = "SHA";  
  19.     public static final String KEY_MD5 = "MD5";  
  20.   
  21.     /** 
  22.      * MAC算法可选以下多种算法 
  23.      *  
  24.      * <pre> 
  25.      * HmacMD5  
  26.      * HmacSHA1  
  27.      * HmacSHA256  
  28.      * HmacSHA384  
  29.      * HmacSHA512 
  30.      * </pre> 
  31.      */  
  32.     public static final String KEY_MAC = "HmacMD5";  
  33.   
  34.     /** 
  35.      * BASE64解密 
  36.      *  
  37.      * @param key 
  38.      * @return 
  39.      * @throws Exception 
  40.      */  
  41.     public static byte[] decryptBASE64(String key) throws Exception {  
  42.         return (new BASE64Decoder()).decodeBuffer(key);  
  43.     }  
  44.   
  45.     /** 
  46.      * BASE64加密 
  47.      *  
  48.      * @param key 
  49.      * @return 
  50.      * @throws Exception 
  51.      */  
  52.     public static String encryptBASE64(byte[] key) throws Exception {  
  53.         return (new BASE64Encoder()).encodeBuffer(key);  
  54.     }  
  55.   
  56.     /** 
  57.      * MD5加密 
  58.      *  
  59.      * @param data 
  60.      * @return 
  61.      * @throws Exception 
  62.      */  
  63.     public static byte[] encryptMD5(byte[] data) throws Exception {  
  64.   
  65.         MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);  
  66.         md5.update(data);  
  67.   
  68.         return md5.digest();  
  69.   
  70.     }  
  71.   
  72.     /** 
  73.      * SHA加密 
  74.      *  
  75.      * @param data 
  76.      * @return 
  77.      * @throws Exception 
  78.      */  
  79.     public static byte[] encryptSHA(byte[] data) throws Exception {  
  80.   
  81.         MessageDigest sha = MessageDigest.getInstance(KEY_SHA);  
  82.         sha.update(data);  
  83.   
  84.         return sha.digest();  
  85.   
  86.     }  
  87.   
  88.     /** 
  89.      * 初始化HMAC密钥 
  90.      *  
  91.      * @return 
  92.      * @throws Exception 
  93.      */  
  94.     public static String initMacKey() throws Exception {  
  95.         KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);  
  96.   
  97.         SecretKey secretKey = keyGenerator.generateKey();  
  98.         return encryptBASE64(secretKey.getEncoded());  
  99.     }  
  100.   
  101.     /** 
  102.      * HMAC加密 
  103.      *  
  104.      * @param data 
  105.      * @param key 
  106.      * @return 
  107.      * @throws Exception 
  108.      */  
  109.     public static byte[] encryptHMAC(byte[] data, String key) throws Exception {  
  110.   
  111.         SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);  
  112.         Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
  113.         mac.init(secretKey);  
  114.   
  115.         return mac.doFinal(data);  
  116.   
  117.     }  
  118. }  



再给出一个测试类:

  1. import static org.junit.Assert.*;  
  2.   
  3. import org.junit.Test;  
  4.   
  5. /** 
  6.  *  
  7.  * @author 梁栋 
  8.  * @version 1.0 
  9.  * @since 1.0 
  10.  */  
  11. public class CoderTest {  
  12.   
  13.     @Test  
  14.     public void test() throws Exception {  
  15.         String inputStr = "简单加密";  
  16.         System.err.println("原文:/n" + inputStr);  
  17.   
  18.         byte[] inputData = inputStr.getBytes();  
  19.         String code = Coder.encryptBASE64(inputData);  
  20.   
  21.         System.err.println("BASE64加密后:/n" + code);  
  22.   
  23.         byte[] output = Coder.decryptBASE64(code);  
  24.   
  25.         String outputStr = new String(output);  
  26.   
  27.         System.err.println("BASE64解密后:/n" + outputStr);  
  28.   
  29.         // 验证BASE64加密解密一致性  
  30.         assertEquals(inputStr, outputStr);  
  31.   
  32.         // 验证MD5对于同一内容加密是否一致  
  33.         assertArrayEquals(Coder.encryptMD5(inputData), Coder  
  34.                 .encryptMD5(inputData));  
  35.   
  36.         // 验证SHA对于同一内容加密是否一致  
  37.         assertArrayEquals(Coder.encryptSHA(inputData), Coder  
  38.                 .encryptSHA(inputData));  
  39.   
  40.         String key = Coder.initMacKey();  
  41.         System.err.println("Mac密钥:/n" + key);  
  42.   
  43.         // 验证HMAC对于同一内容,同一密钥加密是否一致  
  44.         assertArrayEquals(Coder.encryptHMAC(inputData, key), Coder.encryptHMAC(  
  45.                 inputData, key));  
  46.   
  47.         BigInteger md5 = new BigInteger(Coder.encryptMD5(inputData));  
  48.         System.err.println("MD5:/n" + md5.toString(16));  
  49.   
  50.         BigInteger sha = new BigInteger(Coder.encryptSHA(inputData));  
  51.         System.err.println("SHA:/n" + sha.toString(32));  
  52.   
  53.         BigInteger mac = new BigInteger(Coder.encryptHMAC(inputData, inputStr));  
  54.         System.err.println("HMAC:/n" + mac.toString(16));  
  55.     }  
  56. }  



控制台输出:

  1. 原文:  
  2. 简单加密  
  3. BASE64加密后:  
  4. 566A5Y2V5Yqg5a+G  
  5.   
  6. BASE64解密后:  
  7. 简单加密  
  8. Mac密钥:  
  9. uGxdHC+6ylRDaik++leFtGwiMbuYUJ6mqHWyhSgF4trVkVBBSQvY/a22xU8XT1RUemdCWW155Bke  
  10. pBIpkd7QHg==  
  11.   
  12. MD5:  
  13. -550b4d90349ad4629462113e7934de56  
  14. SHA:  
  15. 91k9vo7p400cjkgfhjh0ia9qthsjagfn  
  16. HMAC:  
  17. 2287d192387e95694bdbba2fa941009a  



    BASE64的加密解密是双向的,可以求反解。
    MD5、SHA以及HMAC是单向加密,任何数据加密后只会产生唯一的一个加密串,通常用来校验数据在传输过程中是否被修改。其中HMAC算法有一个密钥,增强了数据传输过程中的安全性,强化了算法外的不可控因素。
    单向加密的用途主要是为了校验数据在传输过程中是否被修改。

C# MD5 与 java MD5 生成的字符串不一致问题

C# MD5 与 java MD5 生成的字符串不一致问题

C# 源码


查了下C#的api ,System.Text.UnicodeEncoding.Unicode.GetBytes(s)用的是utf-16 little-endian编码方式。


java 源码


public static String getMD5(String str, String encoding) throws Exception {

MessageDigest md = MessageDigest.getInstance("MD5");

md.update(str.getBytes(encoding));

byte[] result = md.digest();

StringBuffer sb = new StringBuffer();

for (int i = 0; i < result.length; i++) {

int val = result[i] & 0xff;

sb.append(Integer.toHexString(val));

}

return sb.toString();

}


运行结果

4b98b56b759916acc26268f2792a123

4b98b56b759916acc26268f2792a123


C# 计算字符串的哈希值(MD5、SHA)

C# 计算字符串的哈希值(MD5、SHA)

一、关于本文

本文中是一个类库,包括下面几个函数:

1)计算32位MD5码(大小写):Hash_MD5_32

2)计算16位MD5码(大小写):Hash_MD5_16

3)计算32位2重MD5码(大小写):Hash_2_MD5_32

4)计算16位2重MD5码(大小写):Hash_2_MD5_16

5)计算SHA-1码(大小写):Hash_SHA_1

6)计算SHA-256码(大小写):Hash_SHA_256

7)计算SHA-384码(大小写):Hash_SHA_384

8)计算SHA-512码(大小写):Hash_SHA_512

编译后被打包成文件HashTools.dll,其他程序可以在添加引用后对这些函数进行调用

二、类库中各函数代码

0)类库结构

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HashTools
{
    public class HashHelper
    {
        //各个函数
    }
}

1)计算32位MD5码(大小写):Hash_MD5_32

/// <summary>
/// 计算32位MD5码
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
/// <returns></returns>
public static string Hash_MD5_32(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.MD5CryptoServiceProvider MD5CSP
            = new System.Security.Cryptography.MD5CryptoServiceProvider();

        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = MD5CSP.ComputeHash(bytValue);
        MD5CSP.Clear();

        //根据计算得到的Hash码翻译为MD5码
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }

        //根据大小写规则决定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

2)计算16位MD5码(大小写):Hash_MD5_16

/// <summary>
/// 计算16位MD5码
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
/// <returns></returns>
public static string Hash_MD5_16(string word, bool toUpper = true)
{
    try
    {
        string sHash = Hash_MD5_32(word).Substring(8, 16);
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

3)计算32位2重MD5码(大小写):Hash_2_MD5_32

/// <summary>
/// 计算32位2重MD5码
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
/// <returns></returns>
public static string Hash_2_MD5_32(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.MD5CryptoServiceProvider MD5CSP
            = new System.Security.Cryptography.MD5CryptoServiceProvider();

        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = MD5CSP.ComputeHash(bytValue);

        //根据计算得到的Hash码翻译为MD5码
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }

        bytValue = System.Text.Encoding.UTF8.GetBytes(sHash);
        bytHash = MD5CSP.ComputeHash(bytValue);
        MD5CSP.Clear();
        sHash = "";

        //根据计算得到的Hash码翻译为MD5码
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }

        //根据大小写规则决定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

4)计算16位2重MD5码(大小写):Hash_2_MD5_16

/// <summary>
/// 计算16位2重MD5码
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
/// <returns></returns>
public static string Hash_2_MD5_16(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.MD5CryptoServiceProvider MD5CSP
                = new System.Security.Cryptography.MD5CryptoServiceProvider();

        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = MD5CSP.ComputeHash(bytValue);

        //根据计算得到的Hash码翻译为MD5码
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }

        sHash = sHash.Substring(8, 16);

        bytValue = System.Text.Encoding.UTF8.GetBytes(sHash);
        bytHash = MD5CSP.ComputeHash(bytValue);
        MD5CSP.Clear();
        sHash = "";

        //根据计算得到的Hash码翻译为MD5码
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }

        sHash = sHash.Substring(8, 16);

        //根据大小写规则决定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

5)计算SHA-1码(大小写):Hash_SHA_1

/// <summary>
/// 计算SHA-1码
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
/// <returns></returns>
public static string Hash_SHA_1(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.SHA1CryptoServiceProvider SHA1CSP
            = new System.Security.Cryptography.SHA1CryptoServiceProvider();

        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = SHA1CSP.ComputeHash(bytValue);
        SHA1CSP.Clear();

        //根据计算得到的Hash码翻译为SHA-1码
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }

        //根据大小写规则决定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

6)计算SHA-256码(大小写):Hash_SHA_256

/// <summary>
/// 计算SHA-256码
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
/// <returns></returns>
public static string Hash_SHA_256(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.SHA256CryptoServiceProvider SHA256CSP
            = new System.Security.Cryptography.SHA256CryptoServiceProvider();

        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = SHA256CSP.ComputeHash(bytValue);
        SHA256CSP.Clear();

        //根据计算得到的Hash码翻译为SHA-1码
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }

        //根据大小写规则决定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

7)计算SHA-384码(大小写):Hash_SHA_384

/// <summary>
/// 计算SHA-384码
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
/// <returns></returns>
public static string Hash_SHA_384(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.SHA384CryptoServiceProvider SHA384CSP
            = new System.Security.Cryptography.SHA384CryptoServiceProvider();

        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = SHA384CSP.ComputeHash(bytValue);
        SHA384CSP.Clear();

        //根据计算得到的Hash码翻译为SHA-1码
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }

        //根据大小写规则决定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

8)计算SHA-512码(大小写):Hash_SHA_512

/// <summary>
/// 计算SHA-512码
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
/// <returns></returns>
public static string Hash_SHA_512(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.SHA512CryptoServiceProvider SHA512CSP
            = new System.Security.Cryptography.SHA512CryptoServiceProvider();

        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = SHA512CSP.ComputeHash(bytValue);
        SHA512CSP.Clear();

        //根据计算得到的Hash码翻译为SHA-1码
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }

        //根据大小写规则决定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

三、函数调用
建立项目ComputeHash,添加对HashTools.dll库的引用。并添加代码:

using HashTools;

然后在Main函数中添加下列代码:

static void Main(string[] args)
{
    Console.WriteLine("MD5 of \"abc\"");

    Console.WriteLine("MD5_32(Upper): {0}", 
        HashHelper.Hash_MD5_32("abc"));
    Console.WriteLine("MD5_32(Lower): {0}",
        HashHelper.Hash_MD5_32("abc", false));

    Console.WriteLine("MD5_16(Upper): {0}",
        HashHelper.Hash_MD5_16("abc"));
    Console.WriteLine("MD5_16(Lower): {0}",
        HashHelper.Hash_MD5_16("abc", false));

    Console.WriteLine("2_MD5_32(Upper): {0}", 
        HashHelper.Hash_2_MD5_32("abc"));
    Console.WriteLine("2_MD5_32(Lower): {0}", 
        HashHelper.Hash_2_MD5_32("abc", false));

    Console.WriteLine("2_MD5_32(Upper): {0}", 
        HashHelper.Hash_2_MD5_16("abc"));
    Console.WriteLine("2_MD5_32(Lower): {0}", 
        HashHelper.Hash_2_MD5_16("abc", false));

    Console.WriteLine("SHA of \"abc\"");

    Console.WriteLine("SHA-1(Upper): {0}", 
        HashHelper.Hash_SHA_1("abc"));
    Console.WriteLine("SHA-1(Lower): {0}", 
        HashHelper.Hash_SHA_1("abc", false));

    Console.WriteLine("SHA-256(Upper): {0}",
        HashHelper.Hash_SHA_256("abc"));
    Console.WriteLine("SHA-256(Lower): {0}",
        HashHelper.Hash_SHA_256("abc", false));

    Console.WriteLine("SHA-384(Upper): {0}",
        HashHelper.Hash_SHA_384("abc"));
    Console.WriteLine("SHA-384(Lower): {0}",
        HashHelper.Hash_SHA_384("abc", false));

    Console.WriteLine("SHA-512(Upper): {0}", 
        HashHelper.Hash_SHA_512("abc"));
    Console.WriteLine("SHA-512(Lower): {0}", 
        HashHelper.Hash_SHA_512("abc", false));

    Console.ReadLine();
}

运行结果如下:

END

C#SHA-256与Java SHA-256.结果不同?

C#SHA-256与Java SHA-256.结果不同?

我想将一些 Java中的代码转换为C#.

Java代码:

private static final byte[] SALT = "NJui8*&N823bVvy03^4N".getBytes();

  public static final String getSHA256Hash(String secret)
  {
    try {
      MessageDigest digest = MessageDigest.getInstance("SHA-256");
      digest.update(secret.getBytes());
      byte[] hash = digest.digest(SALT);
      StringBuffer hexString = new StringBuffer();
      for (int i = 0; i < hash.length; i++) {
        hexString.append(Integer.toHexString(0xFF & hash[i]));
      }
      return hexString.toString();
    } catch (NoSuchAlgorithmException e) {
      e.printstacktrace();
    } 
    throw new RuntimeException("SHA-256 realization algorithm not found in JDK!");
  }

当我尝试使用the SimpleHash class时,我得到了不同的哈希值

更新:

例如:

Java:byte [] hash = digest.digest(SALT);
生成(前6个字节):

[0] = 9
[1] = -95
[2] = -68
[3] = 64
[4] = -11
[5] = 53
....

C#代码(类SimpleHash):
string hashValue = Convert.ToBase64String(hashWithSaltBytes);
hashWithSaltBytes有(前6个字节):

[0] 175 byte
[1] 209 byte
[2] 120 byte
[3] 74  byte
[4] 74  byte
[5] 227 byte

解决方法

String.getBytes method使用平台的默认字符集将字符串编码为字节,而您链接的示例代码使用UTF-8.

试试这个:

digest.update(secret.getBytes("UTF-8"));

其次,Integer.toHexString method返回十六进制结果,没有前导0.

我们今天的关于MD5&SHA 加密 util 类Java的分享就到这里,谢谢您的阅读,如果想了解更多关于BASE64、MD5、SHA、HMAC几种加密算法、C# MD5 与 java MD5 生成的字符串不一致问题、C# 计算字符串的哈希值(MD5、SHA)、C#SHA-256与Java SHA-256.结果不同?的相关信息,可以在本站进行搜索。

本文标签: