zoukankan      html  css  js  c++  java
  • Java安全API

    java提供了完整的密码学API,我们可以结合密码学相关的概念来系统的学习这些API。

    1.密码学简介(crypto)
    密码学通俗来说就是研究如何对信息进行加密和破密,如果不是专门研究信息安全,通常我们只需学习和使用加密的方法,所以破密的相关知识我们可以忽略。

    2.加密(Encrypt)
    单以加密来说,密码学可以分为经典密码学和现代密码学,经典密码学的重点在于加密算法,利用移位,替换等方法对信息进行加密,一旦算法被人破译那么信息就会泄露。而现代密码学则不同,现代密码学的安全性是基于密钥,算法反而是公开的。根据密钥的不同,现代密码学可以分为对称加密和非对称加密,顾名思义,对称加密就是通讯双方使用同一对密钥,而非对称加密则是双方都拥有一对私钥和公钥,私钥自己保存而公钥可以对外交换。这样就可以避免对称加密在密钥交换时泄漏的风险。

    3.信息摘要(Message Digest)
    把任意长度的信息压缩成固定长度,在密码学上把经过hash算法计算压缩后的数据称为信息摘要。我们可以通过对比接收到的信息摘要来检验数据的完整性,防止数据在传输过程中被篡改。信息摘要的重点其实就是hash算法。

    4.数据签名(signature)
    要验证数据的完整性,只有信息摘要还是不够的。因为如果攻击者猜测到生成的信息摘要使用的是哪种hash算法(毕竟hash算法其实就MD5,SHA-1那几种),那么攻击者可以篡改信息后,重新生成信息摘要,所以还需要对信息摘要进行加密。数据签名其实可以理解为信息摘要和非对称加密的结合体。

    5.Java安全体系
    Java 安全体系 API 分为四部分:JCA、JCE、JSSE 和 JAAS。
    JCA:Java API 提供基本的加密框架,比如证书、数字签名、消息摘要和密钥产生器。
    JCE:是 JCA 的扩展,提供各种算法的实现、密钥管理等功能,主要位于 javax.crypto 及子包中。
    JSSE:是 Java 安全套接字扩展的缩写,主要提供基于 SSL 安全网络通信的 API。
    JAAS:是 Java 授权与认证服务的缩写,主要用于登录认证与角色权限等管理的 API。
    JCA 和 JCE 并不提供任何加密算法的实现,只是提供接口供第三方实现加密算法。第三方厂 商根据 JCE 的接口实现加密算法,并打包成 Provide(安全提供者),就可以动态地添加到 Java 之中。加载第三方的 JCE 实现,主要有两种方式:a.使用 JRE 的 java.security 文件在 JVM 启 动时添加;b.使用 Provider 管理器 java.security.Security 的静态方法在运行时添加。hotspot虚拟机默认实现了一个Provide-SunJCE,除了Java默认提供的之外,比较著名的第三方实现还有Bouncy Castle 开源类库。

    6.密码学相关API
    java.security.MessageDigest:产生消息摘要对象的工厂类

    例子
     MessageDigest digest = MessageDigest.getInstance("MD5");
     byte[] bytes = digest.digest("MD5".getBytes());
    

    加密密钥:
    java.security.Key:所有密钥的抽象表示,含有算法、二进制编码、编码格式
    java.security.spec.KeySpec:密钥规范(空接口),其下的实现类专用于将二进制密钥数据规 范化为密钥对象。
    java.security.spec.EncodeedKeySpec:编码的密钥规范,主要是公钥和私钥规范的抽象。 公钥采用 X.509 编码,对应于 X509EncodedKeySpec 类;私钥采用 PKCS#8 编码,对应于 PKCS8EncodedKeySpec 类。
    java.security.PublicKey:非对称密码公钥的抽象接口(空接口)
    java.security.PrivateKey:非对称密码私钥的抽象接口(空接口)
    java.security.KeyPair:非对称密钥的包装类,称为密钥对接口,里面有 getPublicKey 和 getPrivateKey 两个方法
    java.security.KeyPairGenerator:随机产生非对称密钥对的工厂
    java.security.KeyFactory:将二进制数据根据密钥规范还原非对称密钥的公钥或者私钥
    java.security.SecureRandom:强随机数发生器,可由第三方提供随机算法
    javax.crypto.KeyGenerator:随机产生对称密钥的工厂
    数字签名:
    java.security.Signature:产生数字签名对象的工厂类

    例子
    public static void keyDemo(byte[] privateKey,byte[] publicKey,byte[] content) throws Exception{
            KeyFactory keyf = KeyFactory.getInstance("RSA");
            //私钥
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey);
            PrivateKey prikey = keyf.generatePrivate(keySpec);
    
            //公钥
            X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(publicKey);
            PublicKey pubKey = keyf.generatePublic(x509EncodedKeySpec);
            //签名
            Signature signature = Signature.getInstance("MD5withRSA");
            signature.initSign(prikey);
            signature.update(content);
            byte[] sign = signature.sign();
            //校验签名
            signature.initVerify(pubKey);
            signature.verify(sign);
     }
    

    加密解密:
    javax.crypto.Cipher:JCE核心的引擎类,提供加密解密功能。

            KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
            KeyPair pair = generator.generateKeyPair();
            //私钥
            PrivateKey prikey = pair.getPrivate();
            //公钥
            PublicKey pubKey = pair.getPublic();
    
            //非对称加密
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.PUBLIC_KEY,pubKey);
            byte[] m = cipher.doFinal(content);
    
            Cipher cipher1 = Cipher.getInstance("RSA");
            //非对称解密
            cipher1.init(Cipher.PRIVATE_KEY,prikey);
            cipher1.update(m);
            byte[] s = cipher1.doFinal();
            System.out.println(new String(s));
    

    总结:Java密码学相关的API提供了大量的工厂方法getInstance(String algorithm),根据不同的算法返回不同的实现类。这样的好处显而易见,这可以让你的代码与具体的算法无关,如果需要更换算法只需要把RSA换成其他算法,其他部分都不需要改变。甚至你还可以把String algorithm参数写到配置文件中,到时候连代码都不用改,直接改配置文件即可。

  • 相关阅读:
    Hadoop Mapreduce分区、分组、二次排序过程详解
    hadoop的NullWritable
    CentOS7.0修改主机名(hostname)
    Linux下不重启永久修改hostname
    稀缺——我们是如何陷入贫穷与忙碌的
    slf4j log4j logback关系详解和相关用法
    使用logstash+elasticsearch+kibana快速搭建日志平台
    安装XAMPP时出现 unable to realloc 83886080 bytes
    ElasticSearch查询max_result_window问题处理
    后台CMS日志处理记录
  • 原文地址:https://www.cnblogs.com/lanqi/p/10717365.html
Copyright © 2011-2022 走看看