java加密與解密-核心包中的部分API(2)

主要是介紹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加密與解密的藝術第二版》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章