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加密与解密的艺术第二版》

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