Java原生支持常見的加密算法,例如DES、RSA。隨便寫點關於Java安全包的東西。 java
Java.security.Provider對象官方的解釋是:實現了 Java 安全性的一部分或者所有。 算法
provider 可能實現的服務包括:算法(如 DSA、RSA、MD5 或 SHA-1),密鑰的生成、轉換和管理設施(如用於特定於算法的密鑰)。 安全
每一個 provider 有一個名稱和一個版本號,而且在每一個它裝入運行時中進行配置。 框架
能夠經過以下語句查看本地JDK提供的provider類型: ide
for(Provider p : Security.getProviders()){ System.out.println(p+" "+p.getInfo()); }
KeyGenerator 對象可重複使用,也就是說,在生成密鑰後,能夠重複使用同一個 KeyGenerator 對象來生成更多的密鑰。生成密鑰的方式有兩種:與算法無關的方式和特定於算法的方式。很少囉嗦,能夠查看API文檔,當中強調了一點:若是客戶端沒有顯式地初始化 KeyGenerator(經過調用 init 方法),那麼每一個提供者都必須提供(並記錄)默認初始化。 this
javax.crypto.SecretKey對稱表示密鑰。 編碼
javax.crypto.spec.IvParameterSpec,此類指定一個初始化向量 (IV)。使用 IV 的例子是反饋模式中的密碼,如,CBC 模式中的 DES 和使用 OAEP 編碼操做的 RSA 密碼。 加密
javax.crypto.Cipher此類爲加密和解密提供密碼功能。它構成了 Java Cryptographic Extension (JCE) 框架的核心。API中的解釋是:爲建立 Cipher 對象,應用程序調用 Cipher 的getInstance 方法並將所請求轉換的名稱傳遞給它。還能夠指定提供者的名稱(可選)。
轉換 是一個字符串,它描述爲產生某種輸出而在給定的輸入上執行的操做(或一組操做)。轉換始終包括加密算法的名稱(例如,DES),後面可能跟有一個反饋模式和填充方案。
轉換具備如下形式:
「算法/模式/填充」或
「算法」
(後一種狀況下,使用模式和填充方案特定於提供者的默認值)。例如,如下是有效的轉換:
Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
好了,基本的對象介紹完了,下面來看看代碼:
spa
import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.Provider; import java.security.Security; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import sun.misc.BASE64Decoder; public class JavaSecurity { public static void main(String[] args) { JavaSecurity js = new JavaSecurity(); String test = "keep foolish , keep hungry"; String entryString = js.encrypt(test); System.out.println(entryString); String decryptString = js.decrypt(entryString); System.out.println(decryptString); } public JavaSecurity(){ try { this.init(); } catch (NoSuchAlgorithmException | NoSuchProviderException | UnsupportedEncodingException | NoSuchPaddingException e) { e.printStackTrace(); } } /** * init() * @throws NoSuchAlgorithmException * @throws NoSuchProviderException * @throws UnsupportedEncodingException * @throws NoSuchPaddingException */ public void init() throws NoSuchAlgorithmException, NoSuchProviderException, UnsupportedEncodingException, NoSuchPaddingException{ //密鑰生成器 keyGenerator = KeyGenerator.getInstance("DES", "SunJCE"); //對稱密鑰 key = keyGenerator.generateKey(); //加解密時的初始化向量 8bytes iv = new IvParameterSpec("87654321".getBytes("utf-8")); //DES加密算法,CBC反饋模式,PKCSPadding的填充方案 cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); } /** * 加密 * @param str * @return * @throws InvalidKeyException * @throws InvalidAlgorithmParameterException * @throws IllegalBlockSizeException * @throws BadPaddingException */ public String encrypt(String str) { String returnStr = ""; try { cipher.init(Cipher.ENCRYPT_MODE, key , iv); } catch (InvalidKeyException | InvalidAlgorithmParameterException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } byte[] strByte = str.getBytes(); //加密 byte[] encryStr = null; try { encryStr = cipher.doFinal(strByte); } catch (IllegalBlockSizeException | BadPaddingException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } returnStr = new sun.misc.BASE64Encoder().encode(encryStr); return returnStr; } /** * 解密 * @param str * @return * @throws InvalidKeyException * @throws InvalidAlgorithmParameterException * @throws IOException * @throws IllegalBlockSizeException * @throws BadPaddingException */ public String decrypt(String str) { String returnStr = ""; try { cipher.init(Cipher.DECRYPT_MODE, key, iv); } catch (InvalidKeyException | InvalidAlgorithmParameterException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } byte[] strByte = null; try { strByte = new BASE64Decoder().decodeBuffer(str); } catch (IOException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } byte[] returnStrByte = null; try { returnStrByte = cipher.doFinal(strByte); } catch (IllegalBlockSizeException | BadPaddingException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } returnStr = new String(returnStrByte); return returnStr; } /** * 密鑰生成器 */ private KeyGenerator keyGenerator; /** * 對稱密鑰 * */ private SecretKey key; /** * 加解密時的初始化向量 8bytes * */ private IvParameterSpec iv; /** * cipher * */ private Cipher cipher; }