加密演算法中BASE64、MD5、SHA、HMAC等之間的區別
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加密的。
通過java程式碼實現如下:
/** * BASE64解密 * * @param key * @return * @throws Exception */ public static byte[] decryptBASE64(String key) throws Exception { return (new BASE64Decoder()).decodeBuffer(key); } /** * BASE64加密 * * @param key * @return * @throws Exception */ public static String encryptBASE64(byte[] key) throws Exception { return (new BASE64Encoder()).encodeBuffer(key); }
主要就是BASE64Encoder、BASE64Decoder兩個類,我們只需要知道使用對應的方法即可。另,BASE加密後產生的位元組位數是8的倍數,如果不夠位數以=符號填充。
MD5
MD5 -- message-digest algorithm 5 (資訊-摘要演算法)縮寫,廣泛用於加密和解密技術,常用於檔案校驗。校驗?不管檔案多大,經過MD5後都能生成唯一的MD5值。好比現在的ISO校驗,都是MD5校驗。怎麼用?當然是把ISO經過MD5後產生MD5的值。一般下載linux-ISO的朋友都見過下載連結旁邊放著MD5的串。就是用來驗證檔案是否一致的。
通過java程式碼實現如下:
/** * MD5加密 * * @param data * @return * @throws Exception */ public static byte[] encryptMD5(byte[] data) throws Exception { MessageDigest md5 = MessageDigest.getInstance(KEY_MD5); md5.update(data); return md5.digest(); }
通常我們不直接使用上述MD5加密。通常將MD5產生的位元組陣列交給BASE64再加密一把,得到相應的字串。
SHA
SHA(Secure Hash Algorithm,安全雜湊演算法),數字簽名等密碼學應用中重要的工具,被廣泛地應用於電子商務等資訊保安領域。雖然,SHA與MD5通過碰撞法都被破解了, 但是SHA仍然是公認的安全加密演算法,較之MD5更為安全。
通過java程式碼實現如下:
/**
* SHA加密
*
* @param data
* @return
* @throws Exception
*/
public static byte[] encryptSHA(byte[] data) throws Exception {
MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
sha.update(data);
return sha.digest();
}
}
HMAC
HMAC(Hash Message Authentication Code,雜湊訊息鑑別碼,基於金鑰的Hash演算法的認證協議。訊息鑑別碼實現鑑別的原理是,用公開函式和金鑰產生一個固定長度的值作為認證標識,用這個標識鑑別訊息的完整性。使用一個金鑰生成一個固定大小的小資料塊,即MAC,並將其加入到訊息中,然後傳輸。接收方利用與傳送方共享的金鑰進行鑑別認證等。
通過java程式碼實現如下:
/**
* 初始化HMAC金鑰
*
* @return
* @throws Exception
*/
public static String initMacKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
SecretKey secretKey = keyGenerator.generateKey();
return encryptBASE64(secretKey.getEncoded());
}
/**
* HMAC加密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptHMAC(byte[] data, String key) throws Exception {
SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
return mac.doFinal(data);
}
給出一個完整類,如下:
import java.security.MessageDigest;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
* 基礎加密元件
*
* @author 樑棟
* @version 1.0
* @since 1.0
*/
public abstract class Coder {
public static final String KEY_SHA = "SHA";
public static final String KEY_MD5 = "MD5";
/**
* MAC演算法可選以下多種演算法
*
* <pre>
* HmacMD5
* HmacSHA1
* HmacSHA256
* HmacSHA384
* HmacSHA512
* </pre>
*/
public static final String KEY_MAC = "HmacMD5";
/**
* BASE64解密
*
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptBASE64(String key) throws Exception {
return (new BASE64Decoder()).decodeBuffer(key);
}
/**
* BASE64加密
*
* @param key
* @return
* @throws Exception
*/
public static String encryptBASE64(byte[] key) throws Exception {
return (new BASE64Encoder()).encodeBuffer(key);
}
/**
* MD5加密
*
* @param data
* @return
* @throws Exception
*/
public static byte[] encryptMD5(byte[] data) throws Exception {
MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
md5.update(data);
return md5.digest();
}
/**
* SHA加密
*
* @param data
* @return
* @throws Exception
*/
public static byte[] encryptSHA(byte[] data) throws Exception {
MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
sha.update(data);
return sha.digest();
}
/**
* 初始化HMAC金鑰
*
* @return
* @throws Exception
*/
public static String initMacKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
SecretKey secretKey = keyGenerator.generateKey();
return encryptBASE64(secretKey.getEncoded());
}
/**
* HMAC加密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptHMAC(byte[] data, String key) throws Exception {
SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
return mac.doFinal(data);
}
}
再給出一個測試類:
import static org.junit.Assert.*;
import org.junit.Test;
/**
*
* @author 樑棟
* @version 1.0
* @since 1.0
*/
public class CoderTest {
@Test
public void test() throws Exception {
String inputStr = "簡單加密";
System.err.println("原文:/n" + inputStr);
byte[] inputData = inputStr.getBytes();
String code = Coder.encryptBASE64(inputData);
System.err.println("BASE64加密後:/n" + code);
byte[] output = Coder.decryptBASE64(code);
String outputStr = new String(output);
System.err.println("BASE64解密後:/n" + outputStr);
// 驗證BASE64加密解密一致性
assertEquals(inputStr, outputStr);
// 驗證MD5對於同一內容加密是否一致
assertArrayEquals(Coder.encryptMD5(inputData), Coder
.encryptMD5(inputData));
// 驗證SHA對於同一內容加密是否一致
assertArrayEquals(Coder.encryptSHA(inputData), Coder
.encryptSHA(inputData));
String key = Coder.initMacKey();
System.err.println("Mac金鑰:/n" + key);
// 驗證HMAC對於同一內容,同一金鑰加密是否一致
assertArrayEquals(Coder.encryptHMAC(inputData, key), Coder.encryptHMAC(
inputData, key));
BigInteger md5 = new BigInteger(Coder.encryptMD5(inputData));
System.err.println("MD5:/n" + md5.toString(16));
BigInteger sha = new BigInteger(Coder.encryptSHA(inputData));
System.err.println("SHA:/n" + sha.toString(32));
BigInteger mac = new BigInteger(Coder.encryptHMAC(inputData, inputStr));
System.err.println("HMAC:/n" + mac.toString(16));
}
}
控制檯輸出:
原文:
簡單加密
BASE64加密後:
566A5Y2V5Yqg5a+G
BASE64解密後:
簡單加密
Mac金鑰:
uGxdHC+6ylRDaik++leFtGwiMbuYUJ6mqHWyhSgF4trVkVBBSQvY/a22xU8XT1RUemdCWW155Bke
pBIpkd7QHg==
MD5:
-550b4d90349ad4629462113e7934de56
SHA:
91k9vo7p400cjkgfhjh0ia9qthsjagfn
HMAC:
2287d192387e95694bdbba2fa941009a
相關推薦
加密演算法中BASE64、MD5、SHA、HMAC等之間的區別
根據專案需要了解了一下幾種加密演算法(參考其他部落格),內容簡要介紹BASE64、MD5、SHA、HMAC幾種加密演算法。BASE64編碼演算法不算是真正的加密演算法。MD5、SHA、HMAC這三種加密演算法,可謂是非可逆加密,就是不可解密的加密方法,我們稱之為單向加密演算
linux之用openssl命令Base64編碼解碼、md5/sha1摘要、AES/DES3加密解密
1、我們先看openssl help命令會輸出什麼? 2、我們用openssl命令實現字串和文字的Base64編碼和解碼 openssl base64 openssl base64 -
加密演算法總結 加密演算法(DES,AES,RSA,MD5,SHA1,Base64)比較和專案應用
加密演算法(DES,AES,RSA,MD5,SHA1,Base64)比較和專案應用 加密技術通常分為兩大類:"對稱式"和"非對稱式"。 對稱性加密演算法:對稱式加密就是加密和解密使用同一個金鑰。資訊接收雙方都需事先知道密匙和加解密演算法且其密匙是相同的,之後便是對資料進行加解密了。對稱加密演算法用
加密演算法(DES,AES,RSA,MD5,SHA1,Base64)比較和專案應用, 各種加密演算法比較
加密演算法(DES,AES,RSA,MD5,SHA1,Base64)比較和專案應用 - sochishun - 部落格園 https://www.cnblogs.com/sochishun/p/7028056.html 加密演算法(DES,AES,RSA,MD
機器學習演算法中的評價指標(準確率、召回率、F值、ROC、AUC等)
參考連結:https://www.cnblogs.com/Zhi-Z/p/8728168.html 具體更詳細的可以查閱周志華的西瓜書第二章,寫的非常詳細~ 一、機器學習效能評估指標 1.準確率(Accurary) 準確率是我們最常見的評價指標,而且很容易理解,就是被分對的樣本
淺談MD5加密演算法中的加鹽值(SALT)
我們知道,如果直接對密碼進行雜湊,那麼黑客可以對通過獲得這個密碼雜湊值,然後通過查雜湊值字典(例如MD5密碼破解網站),得到某使用者的密碼。 加Salt可以一定程度上解決這一問題。所謂加Salt方法,就是加點“佐料”。其基本想法是這樣的:當用戶首次提供密碼時(通常是
加密演算法(DES,AES,RSA,MD5,SHA1,Base64)比較和專案應用
1.加密演算法分類 加密技術通常分為兩大類:”對稱式”和”非對稱式”。 1.1對稱性加密演算法: 對稱式加密就是加密和解密使用同一個金鑰。資訊接收雙方都需事先知道密匙和加解密演算法且其密匙是相同的,之後便是對資料進行加解密了。對稱加密演算法用來對敏感資
常見加密演算法java實現(MD5,SHA-256,SHA-512)
import org.apache.commons.codec.digest.DigestUtils; public class PasswordEncode { private static String pwdAlgorithm = "MD5"; /** * 加密密碼演算法
使用java自帶加密演算法實現文字的md5加密演算法
本篇使用java自帶的MessageDigest實現對文字的md5加密演算法,具體程式碼如下: /** *@Description: 將字串轉化為MD5 */ packa
RSA加密演算法中解密步驟的證明
pq = N p,q為兩個質數 記[N,e], [N,d]分別為演算法中的公鑰和私鑰,根據演算法性質知ed = 1 mod (p-1)(q-1) 這裡的等號為模等,下同 則ed=1 mod (p-1) ed=1 mod (q-1) 記n
加密演算法中的加鹽值
在應用中,出於到安全的考慮和資料的保密,需要使用到加密演算法,有時候為了讓加密的的結果更加撲朔迷離神鬼莫測一些,常常會給被加密的資料加點“鹽”。說白了,鹽就是一串數字,完全是自己定義的,不多說,上例項。 /** * 獲取當前使用者鹽 *
加密演算法極先鋒之MD5演算法
在開發過程中,避免不了要涉及到資料加密,比如使用者賬號密碼的加密,使用者敏感資料的加密,涉及到的加密演算法種類繁多,作為拿來主義的開發者時間精力有限,能夠清楚其中主流的加密演算法和用途,就已經足夠了。 主要的資料加密演算法主要有:md5、sha、aes、des、rsa、base64等等。 先來看看我們的老
AngularJS中的Provider們:Service和Factory等的區別
.config 返回 服務 -a 也不會 sch arr 圖片 get 供應商($provide) $provide服務負責告訴Angular如何創造一個新的可註入的東西:即服務。服務會被叫做供應商的東西來定義,你可以使用$provide來創建一個供應商。你需要使用$pr
BASE64、MD5、SHA、HMAC幾種加密演算法(轉)
本篇內容簡要介紹BASE64、MD5、SHA、HMAC幾種加密演算法。 BASE64編碼演算法不算是真正的加密演算法。 MD5、SHA、HMAC這三種加密演算法,可謂是非可逆加密,就是不可解密的加密方法,我們稱之為單向加密演
專案裡面常用的加密方式base64、AES、MD5、sha-1
今天重新整理了一遍以前專案中經常用到過的幾種加密的方式,發現以前其實對這幾種加密的方式理解的不是特別的深刻首先從加密的本質是來看,是把一些不定長度的資料按照一定的編碼規則輸出為一種一定長度的資料串。這個是我理解的加密,其中不同的加密手段採用不同的編碼規則。閱讀之前先了解一些
Java加密演算法(MD5、SHA-1)
1.MD5演算法(Message Digest Algorithm 5) 可以保證資料傳輸完整性和一致性 摘要後長度為16位元組 摘要資訊中不包含原文資訊,所有加密結果不可逆(無法解密) 一般在傳送檔案時 對原始檔進行md5 hash 傳送到對方後 檢測hash值是否相等 如
commons-codec中[md5,sha,base64加密演算法]的實現demo
專案用到給使用者密碼加密,下載了apache的commons-codec jar包,貼出對幾種加密演算法實現的demo。記之。 commons-codec-1.10下載連結: http://commons.apache.org/proper/commons-codec/do
AES加密解密&&SHA1、SHA加密&&MD5加密
algorithm buffer password 使用 eas ray locks tex update AES加密解密 SHA1、SHA加密 MD5加密 二話不說立即附上代碼: package com.luo.util; import j
【Python】學習筆記4-time、md5、加密base64模塊
數據庫 sta 自己的 pri 時間 decode 不可 字符 ftime 1、time # 1、格式化好的時間 2018-1-14 16:42# 2、時間戳 是從unix元年到現在所有的秒數# 3、時間元組# 想時間戳和格式化好的時間互相轉換的話,都要先轉成時間元組,然後
加密演算法(MD5、RSA、AES)
加密技術通常分為兩大類:"對稱式"和"非對稱式"。 對稱性加密演算法:對稱式加密就是加密和解密使用同一個金鑰。資訊接收雙方都需事先知道密匙和加解密演算法且其密匙是相同的,之後便是對資料進行加解密了。對稱加密演算法用來對敏感資料等資訊進行加密。 非對稱演算法:非對稱式加密就是加密和解密所使用的