主要是介紹java安全框架的核心包中的部分API作用
java.Security包
java.security包主要用於爲安全框架提供類和接口
-
Provider類
Provider類實現了java安全性的一部分或全部,提供者抽象類:
public abstract calss Provider extends Properties
常用的方法:
//獲取提供者name public String getName() //獲取版本號 public double getName() //設置屬性 public synchronizaed Object put(Object key, Object value)
-
Security類
Security類主要是用來管理程序用到的提供者類
//管理提供者,是一個final修飾的類 public final class Security extends Object //向系統中添加一個新的提供者 public static int addProvider(Provider provider) //移除提供者 public static int removeProvider(String name) //獲取提供者 public static int getProvider(String name)
-
MessageDigest類
MessageDigest類主要是實現了消息的摘要算法,繼承MessageDigestSpi類,MessageDigest提供兩大算法類:SHA和MD
//實現創建和驗證消息摘要的操作 public abstract class MessageDigest extends MessageDigestSpi
獲取MessageDigest對象
//獲取MessageDigest對象。 參數:算法名 public static MessageDigest getInstance(String algorithm) //獲取MessageDigest對象。 參數:算法名,提供者 public static MessageDigest getInstance(String algorithm, Provider provider) //獲取MessageDigest對象。 參數:算法名,提供者名稱 public static MessageDigest getInstance(String algorithm, String provider)
基礎操作
//更新摘要,參數:字節或字節數組 public void update(byte input) public void update(byte[] input) //更新摘要,參數流 public void update(byte[] input) //在完成摘要更新後,通過digest來完成摘要處理 public byte[] digest() public byte[] digest(byte[] input)
DEMO:
byte[] input = "sha".getBytes(); MessageDigest sha = MessageDigest.getIntance("SHA"); //更新摘要信息 sha.update(input); //獲取信息摘要 byte[] output = sha.digest();
通過信息摘要流來實現摘要操作:
信息摘要流包括了信息摘要輸入流 DigestInputStream和信息摘要輸出流DigestOutputStream
DEMO:
//信息摘要輸入流處理 byte[] input = "md5".getBytes(); MessageDigest md = MessageDigest.getIntance("MD5"); DigestInputStream dis = new DigestInputStream(new ByteArrayInputStream(input),md); dis.read(input,0,input.length); byte[] output = dis.getMessageDigest.digest(); dis.close(); //信息摘要輸出流處理 byte[] input = "md5".getBytes(); MessageDigest md = MessageDigest.getIntance("MD5"); DigestOutputStream dos = new DigestOutputStream(new ByteArrayInputStream(),md); dis.read(input,0,input.length); byte[] output = dis.getMessageDigest.digest() dis.close();
-
**Key **
Key是所有密鑰的頂層接口,包含三大接口,SecretKey(對稱密鑰頂層接口),PublicKey(非對稱密鑰頂層接口),PrivateKey(非對稱密鑰頂層接口)
-
KeyPair 類
KeyPair 類是非對稱密鑰的擴展,是密鑰對的載體,即密鑰對
KeyPair包括:公鑰和私鑰
//構造方法 public KeyPair(PublicKey publickey, PrivateKey privatekey)
-
KeyPairGenerator類
公鑰和私鑰都是通過KeyPairGenerator來生成,KeyPairGenerator類是可通過getInstance()工廠方法實例化對象
//參數: public static KeyPairGenerator getInstance(String algorithm);
DEMO:
KeyPairGenerator kpg = KeyPairGenerator.getInstance("DSA"); kpg.initialize(1024); KeyPair keypair = kpg.genKeyPair();
-
keyFactory 類
用來生成密鑰的引擎類
KeyPairGenerator kpg = KeyPairGenerator.getInstance("DSA"); kpg.initialize(1024); KeyPair keypair = kpg.genKeyPair(); byte[] keyBytes = keyBytes.getPrivate().getEncode(); PKCS8EncodedKeySpec peks = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyfactory = KeyFactory.getIntance("RSA"); key privateKey = keyfactory.generatePrivate(peks);
-
Signature 類
Signature 類主要是用於加簽和驗籤
byte[] data = "加簽數據data".getBytes(); KeyPairGenerator kpg = KeyPairGenerator.getInstance("DSA"); kpg.initialize(1024); KeyPair keypair = kpg.genKeyPair(); //實例化Signature 類 Signature signature = Signature.getInstance(kpg.getAlgorithm()); signature.initSign(keypair.getPrivate()); signature.update(data); //加簽 byte[] sign = signature.sign(); System.out.println(new String(sign,"utf-8")); //公鑰驗籤 signature.initVerify(keypair.getPublic()); signature.update(data); boolean s = signature.verify(sign);
java.crypt包
java.crypt包爲加密操作提供類和接口
-
Mac類
屬於信息摘要的一種
byte[] input = "mac".getBytes(); KeyGenerate keygenerate = KeyGenerate.getInstance("HmacMD5"); SecretKey key = keygenerate.generateKey(); //初始化mac對象 Mac mac = Mac.getInstance(key.getAlgorithm()); mac.init(key); byte[] output = mac.doFinal(input);
-
KeyGenerate類
與KeyPairGenerate類相似,keygenerate是密鑰生成器
KeyGenerate keygenerate = KeyGenerate.getInstance(); SecretKey key = keygenerate.generateKey();
-
Cipher類
Cipher類爲加密和解密提供了密碼功能,是JCE的核心
//獲取Cipher對象 public static Cipher getInstance(String transformation); //例子 Cipher c = Cipher getInstance("DES"); //”算法/工作模式/填充模式“ Cipher c = Cipher getInstance("DES/CBC/PKCS8Padding");
//解密模式的常量 public final static int DECRYPT_HOME //加密模式的常量 public final static int ENCRYPT_HOME //初始化 public final void init(int opmode, Key key) public final void init(int opmode, Key key, AlgorithmParameters params) //藉助證書初始化 public final void init(int opmode, Certificate certificate) //數據更新 public final byte[] update(bute[] input); public final int update(ByteBuffer input,ByteBuffer output); //執行加密(解密)操作: public final byte[] doFinal();
DEMO
byte[] data = "加簽數據data".getBytes(); KeyGenerate keygenerate = KeyGenerate.getInstance("DES"); SecretKey key = keygenerate.generateKey(); Cipher cipher = Cipher getInstance("DES"); cipher.init(Cipher.ENCRYPT_HOME, key); byte[] input = cipher.diFinal(data); cipher.init(Cipher.DECRYPT_HOME, key); byte[] output = cipher.diFinal(input);
-
CipherInputStream 類和CipherOutputStream 類
屬於密鑰流
CipherInputStream cis = new CipherInputStream(new FileInputStream(new File("secret")),cipher) DataInputStream dis = new DataInputStream(cis); String putput = dis.readUTF(); dis.close();
-
KeySpec 接口
用於將所有密鑰規範分組,有密鑰的規範必須實現此接口
KeySpec的抽象實現類(EncodeKeySpec)構建了用於構建公鑰和私鑰規範,X509EncodeKeySpec用於構建公鑰規範,PKCS8EncodeKeySpec用於構建私鑰規範,
SecretKeySpec是KeySpec實現類,用於構建私密密鑰規範
//X509EncodeKeySpec byte[] publicKeyBytes = keys.getPublic().getEncoded(); X509EncodeKeySpec keyspec = new X509EncodeKeySpec(publickeyBytes); KeyFactory keyfactory = KeyFactory.getInstance("DSA"); PublicKey pk = keyfactory.generatePublic(keyspec); //PKCS8EncodeKeySpec byte[] privateKeyBytes = keys.getPrivate().getEncoded(); PKCS8EncodeKeySpec keyspec = new PKCS8EncodeKeySpec(privateKeyBytes); KeyFactory keyfactory = KeyFactory.getInstance("DSA"); PrivateKey pk = keyfactory.generatePrivate(keyspec);
-
Certificate 類
用於管理證書的抽象類,證書類型有X.509證書,PGP證書和SDSI證書
//基本操作 //返回證書的編碼形式 public abstract byte[] getEncoded(); //從證書中獲取公鑰 public abstract PublicKey getPublicKey();
CertificateFactory 可以通過它將證書導入程序中
public final static CertificateFactory getInstance(String type) //通過CertificateFactory 來生成證書 public final Certificate generateCertificate(InputStream inputstream)
DEMO:
//指明證書爲X.509 CertificateFactory certificatefactory = CertificateFactory.getInstance("X.509"); //獲取證書輸入流 FileInputStream in = new FileInputStream("證書地址"); Certificate certificate = certificatefactory.generateCertificate(in); in.close();
參考:
《java加密與解密的藝術第二版》