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参数写到配置文件中,到时候连代码都不用改,直接改配置文件即可。

Java安全API的更多相关文章

  1. 关于c#调用java中间件api的几个问题

    由于项目需要,做的c#客户端数据库连接串首先肯定不能写死的程序里(数据库很容易被攻击,我们的项目半年改了几次密码...) 放置在配置文件内,都可以看得到,最开始想法将配置文件加密,老师说加密过的文件还 ...

  2. Kylin Java RESTful API

    最近在做大数据方面的开发, 学习研究了一段时间的kylin系统, 对于前端开发需要使用 RESTful API ,但是官网并没有提供详细的Java  API. 经过几天的看文档,最终写出了 Java ...

  3. Java 2D API - 2. Graphics 入门

    Java 2D API强大而复杂,不过大多时候我们只需使用java.awt.Graphcis类的部分功能.下面的内容将覆盖大多数的常见应用. Graphics 类中的方法大致可以分为两类: Draw ...

  4. Java 2D API - 1. 基本概念

    Java 2D API扩展AWT包,对二维图形.文本及成像功能提供了支持,可用于开发复杂的界面.绘图软件和图像编辑器.Java 2D对象位于用户坐标空间(User coordinate space), ...

  5. libj 0.8.2 发布,Java/JavaScript API 的 C++ 实现

    libj 0.8.2 增加了一些新的字符串相关的方法. libj 是一个跨平台的运行库,相当于提供了类似 Java/JavaScript API.libj 的内存管理是自动的,基于 shared_pt ...

  6. Android使用Java Mail API发送邮件

    最近在考虑为已经有的一个应用程序增加一个用户反馈的功能,用户可以通过反馈功能将用户的意见和建议.程序出现的问题以一种更符合用户习惯的方式反馈回来.网上也有一些实现好的反馈程序的服务,包括bug的提交. ...

  7. Java Attach API

    catalog . instrucment与Attach API . BTrace: VM Attach的两种方式 . Sun JVM Attach API 1. instrucment与Attach ...

  8. Atitit. C# java 的api 目录封装结构映射总结

    Atitit. C#  java 的api 目录封装结构映射总结 C# java ref System.Reflection System.Type, java.lang.ref concurrent ...

  9. Java Persistence API(转)

    定义 Java Persistence API JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中.[编辑本段]起源 Sun引入新的JPA ORM规范 ...

  10. [selenium webdriver Java]常用api

    1. 获取元素文本 WebElement类的getText()方法返回元素的innerText属性.所以元素里如果有子节点一样也会被返回出来.如下所示 public class GetText { @ ...

随机推荐

  1. SQLiteOpenHelper 源码

    package com.tongyan.common.db; /** * Copyright (C) 2007 The Android Open Source Project * * Licensed ...

  2. Linux的定时器

    在服务端程序设计中,与时间有关的常见任务有: 获取当前时间,计算时间间隔: 定时操作,比如在预定的时间执行一项任务,或者在一段延时之后执行一项任务. Linux 时间函数 Linux 的计时函数,用于 ...

  3. 在linux下运行jmeter

    之前在用JMeter做性能测试时基本都用自己的笔记本电脑. 考虑到网络传输和占用系统资源情况时进行了以下分析: 1 在笔记本上,开始-cmd "ping 服务器",得到传输时间.在 ...

  4. swift -变量的定义与使用

    使⽤用let来声明常量,使⽤用var来声明变量. ⼀一个常量的值在编译时并不须要获取,可是你仅仅能为它赋值⼀一次.也就是说你能够⽤用常量来表⽰示这样⼀一个值:你仅仅须要决定⼀一次,可是须要使⽤用非常多 ...

  5. Atitit.二维码功能的设计实践 attilax 总结

    Atitit.二维码功能的设计实践 attilax 总结 1.1. 二维码要实现的功能1 1.2. 现有二维码功能设计不足的地方(待改进)1 1.3. 二维码组件1 1.4. Java版  zxing ...

  6. C# 正则表达式替换制定关键词后面的所有内容

    如题,将 {OUTSCIPTE} 关键词后的所有内容替换为string.Empty(包含关键字)这个正则该怎么写?我是 {OUTSCIPTE}(.*)$ 写的但是什么反应也没有 string str= ...

  7. PHP系统学习3 正则

    正则 ^shop 标示匹配与shop开头的字符串 shop$用来匹配与shop结尾的字符串 ^shop$只匹配shop [a-z]匹配所有小写字母 [A-Z]匹配所有大写字母 [a-zA-Z]匹配所有 ...

  8. JAVA连接各种数据库详解

    Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成.JDBC 为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序.然而各个开 ...

  9. 蓝牙(CoreBluetooth)-外部设备(服务端)

    蓝牙(CoreBluetooth)-外部设备(服务端) 主要内容 1. 创建外部管理器对象 2. 设置本地外设的服务和特征 3. 添加服务和特征到到你的设置的数据库中 4. 向外公布你的的服务 5. ...

  10. CCNA2.0笔记_OSI模型

    OSI模型分为七层: –由下到上分别为物理层.数据链路层.网络层.传输层.会话层.表示层.应用层. 特点:1.OSI模型每层都有自己的功能集:2.层与层之间相互独立又相互依靠:3.上层依赖于下层,下层 ...