加密算法
在開發的過程中避免不了使用加密進行操作,例如密碼,文件加密,軟件激活,因為加密算法快上百種就不細說了,講解下常用算法
簡介
算法都是不能逆推的,既然不能破解為什么不安全,因為可以碰撞,就是加密算法進行反向查詢,案例:山東大學王小云教授發現了md5的碰撞原理。具體碰撞過程參考:鏈接
| base64 | Base64編碼是從二進制到字符的過程,可以互相轉換,其實不是算法 | 無 | ☆ | 圖片存儲,參數非原始顯示 |
| md5 | message-digest algorithm 5(信息-摘要算法)MD5哈希函數將任意長度的二進制字符串映射為固定長度的小型二進制字符串。由32位16進制組成散列算法,或者叫做哈希算法 (Hash算法)md5在md4基礎上改進 | 哈希算法 | ★★ | 文件下載簽名校驗完整性 |
| SHA-1 | 安全哈希算法(Secure Hash Algorithm)sha-1是160位(160bit)的哈希值 | 哈希算法 | ★★☆ | 文件下載簽名校驗完整性 |
| SHA-2 | 安全哈希算法(Secure Hash Algorithm)算法為SHA-224、SHA-256、SHA-384和SHA-512 | 哈希算法 | ★★★ | 文件下載簽名校驗完整性 |
| HMAC | HMAC是密鑰相關的哈希運算消息認證碼,HMAC運算利用哈希算法,以一個密鑰和一個消息為輸入,生成一個消息摘要作為輸出。(HmacMD5,HmacSHA1,HmacSHA224,HmacSHA256,HmacSHA384,HmacSHA512) | 哈希算法 | ★★★☆ | 密碼 |
| PBKDF2 | PBKDF2應用一個偽隨機函數以導出密鑰。導出密鑰的長度本質上是沒有限制的(但是,導出密鑰的最大有效搜索空間受限于基本偽隨機函數的結構)(PBKDF2WithHmacSHA1,PBKDF2WithHmacSHA256,PBKDF2WithHmacSHA512) | 哈希算法 | ★★★★ | 密碼 |
| BCrypt | bcrypt是一個跨平臺的文件加密工具。由它加密的文件可在所有支持的操作系統和處理器上進行轉移。它的口令必須是8至56個字符,并將在內部被轉化為448位的密鑰。 | Blowfish算法 | ★★★★ | 主要文件加密 |
| Scrypt | scrpyt算法是由著名的FreeBSD黑客 Colin Percival為他的備份服務 Tarsnap開發的,當初的設計是為了降低CPU負荷,盡量少的依賴cpu計算,利用CPU閑置時間進行計算,因此scrypt不僅計算所需時間長,而且占用的內存也多,使得并行計算多個摘要異常困難,因此利用rainbow table進行暴力攻擊更加困難。 | 密鑰派生函數 參考:鏈接 | ★★★★☆ | 主要虛擬貨幣,密碼,加密 |
算法可靠性參考:鏈接
官方參考 :http://commons.apache.org/proper/commons-codec/
官方參考 :http://commons.apache.org/proper/commons-crypto/
apache提供的加密沒有BCrypt算法官方使用的Scrypt算法
說下commons-codec的簡單使用其它實例參考官方
/*** 編碼base64** @param data 需要編碼的數據 如果是對象需要轉換JSON* @return 編碼之后的內容*/public static String encodeBase64(Object data) {try {if (Objects.nonNull(data)) {return Base64.encodeBase64String(data.toString().getBytes(StandardCharsets.UTF_8));}} catch (Exception e) {e.printStackTrace();}return null;}/*** 解碼base64** @param data 解碼的內容 如果是對象需要轉換JSON* @return 解碼之后的數據*/public static String decodeBase64(Object data) {try {if (Objects.nonNull(data)) {return Arrays.toString(Base64.decodeBase64(data.toString()));}} catch (Exception e) {e.printStackTrace();}return null;}算法可以嵌套多個,提供多密匙,使加密更加可靠。
PBKDF2算法在spring security 密碼加密中有使用
//spring securiy 默認算法 //通過此工廠PasswordEncoderFactories.createDelegatingPasswordEncoder();調用 public class PasswordEncoderFactories {@SuppressWarnings("deprecation")public static PasswordEncoder createDelegatingPasswordEncoder() {String encodingId = "bcrypt";Map<String, PasswordEncoder> encoders = new HashMap<>();encoders.put(encodingId, new BCryptPasswordEncoder());encoders.put("ldap", new org.springframework.security.crypto.password.LdapShaPasswordEncoder());encoders.put("MD4", new org.springframework.security.crypto.password.Md4PasswordEncoder());encoders.put("MD5", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("MD5"));encoders.put("noop", org.springframework.security.crypto.password.NoOpPasswordEncoder.getInstance());encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());encoders.put("scrypt", new SCryptPasswordEncoder());encoders.put("SHA-1", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-1"));encoders.put("SHA-256", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-256"));encoders.put("sha256", new org.springframework.security.crypto.password.StandardPasswordEncoder());return new DelegatingPasswordEncoder(encodingId, encoders);}private PasswordEncoderFactories() {}}如果你的項目集成security寫個簡單例子:
//strength強度,密碼迭代次數 between 4 and 31BCryptPasswordEncoder bCrypt = new BCryptPasswordEncoder(BCryptPasswordEncoder.BCryptVersion.$2Y, 31, random);//編碼,BCryptVersion.$2Y默認會作為鹽(密匙)參考源碼bCrypt.encodeString encode = bCrypt.encode("123456");//校驗bCrypt.matches("123456",encode);總結
- 上一篇: ASP.NET MVC diyUploa
- 下一篇: matlab 反应谱,matlab绘制反