Java 常用的 4 種加密方式
一、工具類
md5 加密工具類
public class MD5Utils
private static final String hexDigIts[] = {"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
/**
* MD5 加密
* @param origin 字元
* @param charsetname 編碼
* @return
*/
public static String MD5Encode(String origin, String charsetname){
String resultString = null;
try{
resultString = new String(origin);
MessageDigest md = MessageDigest.getInstance("MD5");
if(null == charsetname || "".equals(charsetname)){
resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
}else{
resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));
}
}catch (Exception e){
}
return resultString;
}
public static String byteArrayToHexString(byte b[]){
StringBuffer resultSb = new StringBuffer();
for(int i = 0; i < b.length; i++){
resultSb.append(byteToHexString(b[i]));
}
return resultSb.toString();
}
public static String byteToHexString(byte b){
int n = b;
if(n < 0){
n += 256;
}
int d1 = n / 16;
int d2 = n % 16;
return hexDigIts[d1] + hexDigIts[d2];
}
}
Java MD5 雜湊示例
public class SimpleMD5Example
{
public static void main(String[] args)
{
String passwordToHash = "password";
String generatedPassword = null;
try {
// Create MessageDigest instance for MD5
MessageDigest md = MessageDigest.getInstance("MD5");
//Add password bytes to digest
md.update(passwordToHash.getBytes());
//Get the hash's bytes
byte[] bytes = md.digest();
//This bytes[] has bytes in decimal format;
//Convert it to hexadecimal format
StringBuilder sb = new StringBuilder();
for(int i=0; i< bytes.length ;i++)
{
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
}
//Get complete hashed password in hex format
generatedPassword = sb.toString();
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
System.out.println(generatedPassword);
}
}
儘管MD5 是一種廣泛使用的雜湊演算法,但遠非安全, MD5 會產生相當弱的雜湊值。它的主要優點是速度快,易於實施。但這也意味著它容易受到 蠻力和字典攻擊。
生成單詞和雜湊的彩虹表允許非常快速地搜尋已知雜湊並獲得原始單詞。
MD5 不是抗衝突的,這意味著不同的密碼最終會導致相同的雜湊。
今天,如果您在應用程式中使用MD5 雜湊,請考慮在安全性中新增一些鹽。
使用salt 使 MD5 更安全
請記住,新增鹽不是MD5 特定的。您也可以將其新增到其他演算法中。因此,請關注它的應用方式,而不是它與 MD5 的關係。
維基百科將salt 定義為隨機資料,用作雜湊密碼或密碼短語的單向函式的附加輸入。更簡單的說, salt 是一些隨機生成的文字,在獲取雜湊值之前會附加到密碼中。
salting 的最初意圖主要是打敗預先計算的彩虹表攻擊,否則可以用來大大提高資料庫的效率。現在更大的好處是減慢並行操作,將一次密碼猜測的雜湊值與多個密碼雜湊值進行比較。
重要提示:我們總是需要使用SecureRandom 來建立好的鹽,而在 Java 中, SecureRandom 類支援“ SHA1PRNG ”偽隨機數生成器演算法,我們可以利用它。
如何為Hash 生成 Salt
讓我們看看應該如何生成鹽。
private static byte[] getSalt() throws NoSuchAlgorithmException
{
//Always use a SecureRandom generator
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
//Create array for salt
byte[] salt = new byte[16];
//Get a random salt
sr.nextBytes(salt);
//return salt
return salt;
}
SHA1PRNG 演算法用作基於 SHA-1 訊息摘要演算法的加密強偽隨機數生成器。請注意,如果未提供種子,它將從真正的隨機數生成器( TRNG )生成種子。
Java MD5 與鹽的例子
現在,讓我們看看修改後的MD5 雜湊示例:
public class SaltedMD5Example
{
public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchProviderException
{
String passwordToHash = "password";
byte[] salt = getSalt();
String securePassword = getSecurePassword(passwordToHash, salt);
System.out.println(securePassword); //Prints 83ee5baeea20b6c21635e4ea67847f66
String regeneratedPassowrdToVerify = getSecurePassword(passwordToHash, salt);
System.out.println(regeneratedPassowrdToVerify); //Prints 83ee5baeea20b6c21635e4ea67847f66
}
private static String getSecurePassword(String passwordToHash, byte[] salt)
{
String generatedPassword = null;
try {
// Create MessageDigest instance for MD5
MessageDigest md = MessageDigest.getInstance("MD5");
//Add password bytes to digest
md.update(salt);
//Get the hash's bytes
byte[] bytes = md.digest(passwordToHash.getBytes());
//This bytes[] has bytes in decimal format;
//Convert it to hexadecimal format
StringBuilder sb = new StringBuilder();
for(int i=0; i< bytes.length ;i++)
{
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
}
//Get complete hashed password in hex format
generatedPassword = sb.toString();
}
catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return generatedPassword;
}
//Add salt
private static byte[] getSalt() throws NoSuchAlgorithmException, NoSuchProviderException
{
//Always use a SecureRandom generator
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "SUN");
//Create array for salt
byte[] salt = new byte[16];
//Get a random salt
sr.nextBytes(salt);
//return salt
return salt;
}
}
重要提示:請注意,現在您必須為您雜湊的每個密碼儲存此salt 值。因為當使用者在系統中重新登入時,必須僅使用最初生成的 salt 再次建立雜湊以匹配儲存的雜湊。如果使用不同的外匯返傭http://www.kaifx.cn/鹽(我們生成隨機鹽),則生成的雜湊將不同。
此外,您可能聽說過瘋狂雜湊和醃製這個術語。它通常指建立自定義組合。
base64 加密工具類
public class Base64Util {
// 字串編碼
private static final String UTF_8 = "UTF-8";
/**
* 加密字串
* @param inputData
* @return
*/
public static String decodeData(String inputData) {
try {
if (null == inputData) {
return null;
}
return new String(Base64.decodeBase64(inputData.getBytes(UTF_8)), UTF_8);
} catch (UnsupportedEncodingException e) {
}
return null;
}
/**
* 解密加密後的字串
* @param inputData
* @return
*/
public static String encodeData(String inputData) {
try {
if (null == inputData) {
return null;
}
return new String(Base64.encodeBase64(inputData.getBytes(UTF_8)), UTF_8);
} catch (UnsupportedEncodingException e) {
}
return null;
}
public static void main(String[] args) {
System.out.println(Base64Util.encodeData(" 我是中文 "));
String enStr = Base64Util.encodeData(" 我是中文 ");
System.out.println(Base64Util.decodeData(enStr));
}
}
Bcrypt 工具類
public class BcryptCipher {
// generate salt seed
private static final int SALT_SEED = 12;
// the head fo salt
private static final String SALT_STARTSWITH = "$2a$12";
public static final String SALT_KEY = "salt";
public static final String CIPHER_KEY = "cipher";
/**
* Bcrypt encryption algorithm method
* @param encryptSource
* need to encrypt the string
* @return Map , two values in Map , salt and cipher
*/
public static Map<String, String> Bcrypt(final String encryptSource) {
String salt = BCrypt.gensalt(SALT_SEED);
Map<String, String> bcryptResult = Bcrypt(salt, encryptSource);
return bcryptResult;
}
/**
*
* @param salt encrypt salt, Must conform to the rules
* @param encryptSource
* @return
*/
public static Map<String, String> Bcrypt(final String salt, final String encryptSource) {
if (StringUtils.isBlank(encryptSource)) {
throw new RuntimeException("Bcrypt encrypt input params can not be empty");
}
if (StringUtils.isBlank(salt) || salt.length() != 29) {
throw new RuntimeException("Salt can't be empty and length must be to 29");
}
if (!salt.startsWith(SALT_STARTSWITH)) {
throw new RuntimeException("Invalid salt version, salt version is $2a$12");
}
String cipher = BCrypt.hashpw(encryptSource, salt);
Map<String, String> bcryptResult = new HashMap<String, String>();
bcryptResult.put(SALT_KEY, salt);
bcryptResult.put(CIPHER_KEY, cipher);
return bcryptResult;
}
}
二、加密測試
MD5 加密測試
/**
* MD5 加密
*/
public class MD5Test {
public static void main(String[] args) {
String string = " 你好 世界 ";
String byteArrayToHexString = MD5Utils.byteArrayToHexString(string.getBytes());
System.out.println(byteArrayToHexString);//e68891e698afe4b880e58fa5e8af9d
}
}
base64 加密測試
/**
* base64 加密
*/
public class Bast64Tester {
public static void main(String[] args) {
String string = " 你好 世界 ";
String encodeData = Base64Util.encodeData(string); // 加密
String decodeData = Base64Util.decodeData(encodeData); // 解密
System.out.println(encodeData);//5oiR5piv5LiA5Liq5a2X56ym5Liy
System.out.println(decodeData);// 你好 世界
}
}
SHA 加密測試
/**
* SHA 加密
*/
public class ShaTest {
public static void main(String[] args) {
String string = " 你好 世界 ";
String sha256Crypt = Sha2Crypt.sha256Crypt(string.getBytes()); System.out.println(sha256Crypt);//$5$AFoQTeyt$TiqmobvcQXjXaAQMYosAAO4KI8LfigZMGHzq.Dlp4NC
}
}
BCrypt 加密測試
/**
* BCrypt 加密
*/
public class BCryptTest {
public static void main(String[] args) {
String string = " 你好世界 ";
Map<String, String> bcrypt = BcryptCipher.Bcrypt(string);
System.out.println(bcrypt.keySet()); //[cipher, salt]
System.out.println(bcrypt.get("cipher")); //$2a$12$ylb92Z84gqlrSfzIztlCV.dK0xNbw.pOv3UwXXA76llOsNRTJsE/.
System.out.println(bcrypt.get("salt")); //$2a$12$ylb92Z84gqlrSfzIztlCV.
Map<String, String> bcrypt2 = BcryptCipher.Bcrypt(bcrypt.get("salt"),string);
System.out.println(bcrypt2.get("SALT_KEY")); //null
System.out.println(bcrypt2.get("CIPHER_KEY")); //null
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946279/viewspace-2661081/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java 常用的 4 種加密方式(MD5+Base64+SHA+BCrypt)Java加密
- java md5加密的幾種方式Java加密
- 網路安全中常用的幾種加密方式都有哪些?加密
- 前端常用6種資料加密方式的使用(最詳解)前端加密
- Java實際工作裡用到的幾種加密方式Java加密
- 常用的兩種加密原理加密
- Android中常用的加密方式Android加密
- Java實現常用加密演算法-SM4Java加密演算法
- RMAN加密備份的三種方式加密
- nodejs常用加密方式 RSA & AESNodeJS加密
- 支付對接常用的加密方式介紹以及java程式碼實現加密Java
- Java和SpringBoot安全加密方式選擇哪種? - foojayJavaSpring Boot加密
- HTTPS-各種加密方式HTTP加密
- Java中確保執行緒安全最常用的兩種方式Java執行緒
- iOS實現幾種會用到的加密方式iOS加密
- app直播商城原始碼,有哪些常用的加密方式APP原始碼加密
- 【java】【多執行緒】建立執行緒的兩種常用方式(2)Java執行緒
- 淺談常用影片加密原理及加密的幾種應用形式加密
- js中建立物件的幾種常用方式JS物件
- SQL Server常用的幾種啟動方式SQLServer
- Docker容器進入的4種方式Docker
- java使用DES加密方式,實現對資料的加密解密Java加密解密
- 【開發經驗】幾種常見的加密方式加密
- java建立物件的五種方式Java物件
- Java 建立類的四種方式Java
- Java 常用加密解密演算法Java加密解密演算法
- spring常用的三種依賴注入方式Spring依賴注入
- sqlplus常用的幾種登入方式SQL
- Python常用的四種數值交換方式!Python
- iOS App間常用的五種通訊方式iOSAPP
- 淺談iOS常用的幾種傳值方式iOS
- IOS資料儲存常用的5種方式iOS
- 部署Linux.NET的4種方式Linux
- iOS儲存資料的4種方式iOS
- javascript實現的繼承的幾種常用方式JavaScript繼承
- java正規表示式四種常用的處理方式(匹配、分割、替代、獲取)Java
- Java中建立物件的5種方式Java物件
- Java 反射機制的三種方式Java反射