口令加密算法 - Java加密与安全
生活随笔
收集整理的這篇文章主要介紹了
口令加密算法 - Java加密与安全
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
口令加密我們在前面介紹了對稱加密算法,他們的key其實一個byte數組,例如AES256算法,他的key實際上是一個32位的數組
我們普通的加入軟件有所不同,我們在使用WinRAR這樣的軟件的時候,通常是用戶輸入的加密口令
如果我們要用戶自己輸入口令,我們就需要用到PBE算法,它是Password Based Encryption的縮寫,PEB算法是由用戶輸入口令,然后采用隨機數雜湊計算,生成密鑰然后再進行加密1. 首先我們看password也就是用戶口令,例如hello1232. 隨著salt是隨機生成的一個byte數組3. 最后的加密密鑰key,它是由隨機的salt和用戶的password計算而成的
我們來比較一下標準的AES方法和PEB方法,在標準的AES算法中,用于加密的密鑰key,他這個是隨機產生的,在PBE算法通過用戶輸入的密碼password,以及隨機產生的16個字節的salt,基于這兩部分生成的key,進行加密,為什么要使用salt呢,因為用戶輸入的口令通常都很短,引入一個隨機的salt,既可以增加口令的長度,還可以讓相同的口令生成相同的key,從而提高了安全性
package com.learn.securl;import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.security.Security;
import java.util.Base64;import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;import org.bouncycastle.jce.provider.BouncyCastleProvider;public class PBECipher {/*** 首先我們要Castle的jar包引入到項目中*/static final String CIPHER_NAME = "PBEwithSHA1and128bitAES-CBC-BC";/*** 加密*/public static byte[] encrypt(String password, byte[] salt, byte[] input) throws Exception {/*** 我們在加密的時候需要創建一個PBEKeySpec* 還有傳入的用戶輸入的password* 得到一個PBEKeySpec對象*/PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());/*** 然后我們通過SecretKeyFactory* 通過getInstance方法* 得到一個SecretKeyFactory對象*/SecretKeyFactory sKeyFactory = SecretKeyFactory.getInstance(CIPHER_NAME);/*** 然后通過generateSecret傳入keySpec* 就可以得到一個SecretKey* 這個SecretKey就是我們將來要加密的密鑰*/SecretKey skey = sKeyFactory.generateSecret(keySpec);/*** 緊接著我們要通過salt生成一個PBEParameterSpec* 我們傳入1000* 表示用戶的口令和salt會走1000次的循環*/PBEParameterSpec pbeps = new PBEParameterSpec(salt, 1000);/*** 然后我們通過Cipher.getInstance得到一個Cipher對象*/Cipher cipher = Cipher.getInstance(CIPHER_NAME);/*** init方法會傳入ENCRYPT_MODE,SecretKey,* 以及PBEParameterSpec這三個對象然后就可以加密*/cipher.init(Cipher.ENCRYPT_MODE, skey, pbeps);/*** 得到密文*/return cipher.doFinal(input);}/*** 解密* * 在解密的時候我們需要傳入用戶需要的password,salt,以及密文*/public static byte[] decrypt(String password, byte[] salt, byte[] input) throws Exception {PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());SecretKeyFactory sKeyFactory = SecretKeyFactory.getInstance(CIPHER_NAME);SecretKey skey = sKeyFactory.generateSecret(keySpec);PBEParameterSpec pbeps = new PBEParameterSpec(salt, 1000);Cipher cipher = Cipher.getInstance(CIPHER_NAME);/*** 然后我們把模式設置為DECRYPT_MODE*/cipher.init(Cipher.DECRYPT_MODE, skey, pbeps);return cipher.doFinal(input);}/*** 我們運行這個代碼* 由于我們每次運行的salt是不同的* 所以每次我們得到密文也是不同的* 通過用戶口令和隨機數* 我們就保證了加密的強度* @param args* @throws Exception*/public static void main(String[] args) throws Exception {// 把BouncyCastle作為Provider添加到java.security:Security.addProvider(new BouncyCastleProvider());// 原文:String message = "Hello, world! encrypted using PBE!";// 加密口令/*** 我們設置一個加密口令password hello123456*/String password = "hello12345";// 16 bytes隨機Salt:/*** 我們通過SecureRandom.getInstanceStrong().generateSeed生成一個隨機salt*/byte[] salt = SecureRandom.getInstanceStrong().generateSeed(16);/*** 我們打印這個salt* salt: d4356ec3e5621a8f1f6a7be953b0c31e* 我們生成的隨機的salt* 1個16字節的數組*/System.out.printf("salt: %032x\n", new BigInteger(1, salt));// 加密:byte[] data = message.getBytes(StandardCharsets.UTF_8);/*** 然后調用encrypt方法進行加密*/byte[] encrypted = encrypt(password, salt, data);/*** 加密以后的密文是用Base64表示的* encrypted: 2MnA9wd1IL4n0W3d3nS5dqZ6dj1fcxZI2GJtKKIDYchw1EkodmJeOLIQpUBendR+*/System.out.println("encrypted: " + Base64.getEncoder().encodeToString(encrypted));// 解密:byte[] decrypted = decrypt(password, salt, encrypted);/*** 解密以后得到與原文相同的信息* Hello, world! encrypted using PBE!*/System.out.println(new String(decrypted, "UTF-8"));}
}
在PBE算法中,如果我們把salt固定下來,就得到了一個通用的口令加密軟件如果我們把salt存在一個U盤上,實際上就得到了一個口令+USB Key的軟件,這樣的好處是即使用戶使用了一個非常弱的口令,沒有USB Key仍然無法解密,因為只有同時破解了口令和salt,才能計算出key,而salt一般都是128位的隨機數,一般很難被破解最后我們總結一下:1. PBE算法通過用戶口令和隨機salt計算key然后再加密2. 用于加密的Key是通過口令和隨機salt計算得出的,因此提高了安全性3. 在PBE算法的內部,仍然是標準的對稱加密算法,例如AES
?
總結
以上是生活随笔為你收集整理的口令加密算法 - Java加密与安全的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对称加密算法 - Java加密与安全
- 下一篇: 密钥交换算法 - Java加密与安全