java 对象加密_java.security包实现对象加密
Java原生支持常見的加密算法,例如DES、RSA。隨便寫點關于Java安全包的東西。
Java.security.Provider對象官方的解釋是:實現了 Java 安全性的一部分或者全部。
provider 可能實現的服務包括:算法(如 DSA、RSA、MD5 或 SHA-1),密鑰的生成、轉換和管理設施(如用于特定于算法的密鑰)。
每個 provider 有一個名稱和一個版本號,并且在每個它裝入運行時中進行配置。
可以通過如下語句查看本地JDK提供的provider類型:
for(Provider p : Security.getProviders()){
System.out.println(p+" "+p.getInfo());
}
javax.crypto.KeyGenerator對象作為對稱密鑰生成器,JavaAPI當中給出的解釋是:密鑰生成器是使用此類的某個 getInstance 類方法構造的。
KeyGenerator 對象可重復使用,也就是說,在生成密鑰后,可以重復使用同一個 KeyGenerator 對象來生成更多的密鑰。生成密鑰的方式有兩種:與算法無關的方式和特定于算法的方式。不多啰嗦,可以查看API文檔,當中強調了一點:如果客戶端沒有顯式地初始化 KeyGenerator(通過調用 init 方法),那么每個提供者都必須提供(并記錄)默認初始化。
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");
好了,基本的對象介紹完了,下面來看看代碼:
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;
}
總結
以上是生活随笔為你收集整理的java 对象加密_java.security包实现对象加密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详解缠中说禅走势中枢
- 下一篇: android string数组转jso