SHA1密碼編譯演算法
SHA是一種資料加密演算法,該演算法經過加密專家多年來的發展和改進已日益完善,現在已成為公認的最安全的散列演算法之一,並被廣泛使用。該演算法的思想是接收一段明文,然後以一種無法復原的方式將它轉換成一段(通常更小)密文,也可以簡單的理解為取一串輸入碼(稱為預映射或資訊),並把它們轉化為長度較短、位元固定的輸出序列即散列值(也稱為資訊摘要或資訊認證代碼)的過程。散列函數值可以說是對明文的一種“指紋”或是“摘要”,所以對散列值的數位簽章就可以視為對此明文的數位簽章。
安全散列演算法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); }}