在Java的知识体系中,Java平台安全是很重要的一部分。作为Android开发者,其实这部分知识对我们来说既陌生又熟悉。说熟悉,Android中Apk打包离不开的jks签名文件,Android 6.0提供的指纹识别接口的调用(Demo), 都是建立在Android平台安全的体系上。而Android平台安全又是建立在Java平台安全的这个坚实的基础上。说陌生,对于Java密码学架构(Java Cryptography Architecture 简称JCA)的还挺陌生,该系列文章分为上下两部分,这一篇主要聊聊JCA的基础知识,可能有些枯燥,在下篇,我会结合具体代码,完成一次简单的字符串缓存加密和解密。

JCA的基本介绍

Java平台重视安全性,包括语言安全性,密码学,公钥基础设施,身份验证,安全通行和访问控制。

JCA是JDk平台上非常重要的部分,通过包含一个 “provider”架构,设计了一套API为包括 数字签名、消息摘要、证书和证书验证、加密(对称和非对称,分组和流式密码)、秘钥生成和管理、安全随机码生成等功能服务。

可以看出,JCA是Java平台安全的基础,其它相关的还有Java密码学拓展(Java Cryptography Extension 简称JCE)、Java Secure Socket Extension (JSSE) 、Java Generic Security Services (JGSS)。

JCA的设计原则

JCA在设计之初就遵循一些基本原则,也就是

·         实现的独立性和互操作性

·         算法的独立性和可扩展性

应用无需实现具体的安全算法,或者说应用请求来自Java平台的安全服务。这些安全服务在“providers”(下面会介绍)中实现,这些providers可以互相协作,与应用之间没有必然的绑定限制。Java平台提供了现成的实现算法的providers,应用也可以通过自定义providers来实现特殊的算法。

JCA的架构

Cryptographic Service Providers CSP 密码服务提供者

刚才在设计原则那部分,反复提到了“providers”,那providers到底是个什么东西呢? JCA文档是这么介绍的:

a package or set of packages that supply a concrete implementation of a subset of the JDK Security API cryptography features

一个包或包结合,提供JDK安全API密码特性的具体实现

这么看还是很抽象,首先要了解java.security.Provider,这个抽象类是所有安全提供者的基础类。每一个CSP,也就是我们的密码服务提供者,都包含java.security.Provider类的一个实例,这个实例包含了“providers”的名称和所有实现的安全服务/算法的列表,当我们需要某种算法时,JCA框架就会去查询这个“providers”数据库,找到匹配的实例并创建它。123456789101112131415public abstract class Provider extends Properties {private String name;private String info;private double version;private transient Set> entrySet = null;private transient int entrySetCallCount = 0;private transient boolean initialized;...}

引用下JCA文档中的这张图:

配合这张图就很清晰了,我们开发者处于应用层,JCA框架层对应用层只提供接口,具体的实现逻辑被封装起来。12//我们仅需通过具体的Engine class并提供需要的算法名称“MD5”,我们就可以获得一个provider实现的消息摘要实例MessageDigest md = MessageDigest.getInstance("MD5");

Key Management 秘钥的管理

KeyStore是一个数据库,它可以被用于管理秘钥和证书的仓库。秘钥可用于应用的的数据验证,加密或签名。Sun Microsystems提供了默认的KeyStore实现。它将秘钥实现为一个文件,使用专有的秘钥类型(格式)叫“jks”.其他的秘钥格式如”jceks”(一种比jks加密强度更大的秘钥库格式)、”pkcs12”等。Android开发者应该很熟悉jks,打包生成apk的时候,我们就会用到jkd格式的秘钥。

例如,Android系统提供了默认的KeyStore,可以通过名称“AndroidKeyStore”来获取12KeyStore mKeyStore = KeyStore.getInstance("AndroidKeyStore");

Engine Classes and Algorithms 引擎类和算法

例如上文MessageDigest就是一类引擎类,1.4会介绍一些常用的引擎类,这里就不多做介绍了。

JCA的核心类和接口

看到这,想必大家对Providers,KeyStore,引擎类, 算法这些概念有了一些基础的认知。先放松一下,看一下gakki的笑容,放松一下。

骚年,我们继续。从API这个角度入手,了解一下JCA框架有哪些基础的类。了解之后,才方便我们后面的实战部分。

JCA的类大致可以分为以下几种:

·         Provider and Security 类

·         各种Engine类,如SecureRandom, MessageDigest, Signature, Cipher, Mac, KeyFactory, SecretKeyFactory, KeyPairGenerator, KeyGenerator, KeyAgreement, AlgorithmParameters, AlgorithmParameterGenerator , KeyStore, and CertificateFactory

·         Key 接口和类

·         算法参数规格接口和类(the Algorithm Parameter Specification Interfaces and Classes)

秘钥规格接口和类(the Key Specification Interfaces and Classes)

·         多种支持和便利接口和类

Key

首先了解一下秘钥,对应的定义是java.security.Key,是所有opaque keys的顶层接口,所谓opaque keys,也就是无法直接访问到构成key的材料,也就是说opaque keys给予了访问限制。只能通过getAlgorithm()、getFormat()、getEncoded()这些方法来获取到秘钥指定的信息。12345678910public interface Key extends java.io.Serializable {static final long serialVersionUID = 6603384152749567654L;public String getAlgorithm();public String getFormat();public byte[] getEncoded();}

KeyStore

用于创建和管理秘钥库, KeyStore是秘钥的数据库。秘钥库中的私有秘钥有与之相关的证书链,用于验证相关联的公有密钥。秘钥库也包含来自受信任实体的证书。上文有介绍,这里就不多说了。

KeyGenerator

通过使用特殊算法来生成秘钥,如果希望生成非对称秘钥,请使用KeyPairGenerator

初始化:有两种初始化方式:

·         算法无关12345public void init(SecureRandom random);public void init(int keysize);public void init(int keysize, SecureRandom random);

·         算法相关123public void init(AlgorithmParameterSpec params);public void init(AlgorithmParameterSpec params, SecureRandom random);

生成秘钥1public SecretKey generateKey();

·         AlgorithmParameterSpec

算法参数,看源码可知只是个接口,具体的实现如KeyGenParameterSpec12345678910111213141516171819package java.security.spec;/*** A (transparent) specification of cryptographic parameters.**

This interface contains no methods or constants. Its only purpose* is to group (and provide type safety for) all parameter specifications.* All parameter specifications must implement this interface.** @author Jan Luehe*** @see java.security.AlgorithmParameters* @see DSAParameterSpec** @since 1.2*/public interface AlgorithmParameterSpec { }

KeyGenParameterSpec

参数很多,显然也是通过构建者模式进行的初始化,构建者AlgorithmParameterSpec.Builder,重要的参数有

秘钥别名,秘钥目的,block modes、EncryptionPadding等

PurposeEnum

秘钥目的:加密、解密、签名、验证123456789101112131415161718192021public @interface PurposeEnum {}/*** Purpose of key: encryption.*/public static final int PURPOSE_ENCRYPT = 1 <

下面介绍几个Engine class

Cipher

用于数据的加密和解密,通过秘钥初始化。有几种不同的算法:如 对称加密协议symmetric bulk encryption(AES, DES, DESede, Blowfish, IDEA),流式加密stream encryption(RC4等), 非对称加密asymmetric encryption(RSA等), 密码基础的加密password-based encryption(PBE)

signature

提供用于密码数字签名算法(如DSA或RSAwithMD5)的功能

MessageDigest

提供密码信息摘要(如SHA-1或MD5)的功能,接受任意直接长度的输入(byte[]格式),生成

固定长度的输出(称为digest或hash)

Mac

Message Authentication Code的缩写,与MessageDigest类似, 用于检测信息的完整性以及在不可靠媒介上存储(包含一个secret key,持有正确key的人能够验证已接收的信息)

android 常用加密,Android的加密缓存(上)--JCA基础相关推荐

  1. 安卓项目实战之:Android常用的5种加密方式

    前言 按加密结果是否可以被解密分为可逆和不可逆: 1,不可逆: MD5(Message-Digest消息摘要):不可逆,长度固定(32位),容易计算,仅一字节只差加密结果都会有很大区别 通常情况下为了 ...

  2. android 常用混淆,Android常用的代码混淆整理【原创】

    android里的代码混淆是比不可少的东西,下面就贴一些常用的代码混淆. #指定代码的压缩级别 -optimizationpasses 5 #包明不混合大小写 -dontusemixedcasecla ...

  3. android 常用混淆,Android 一些常用的混淆Proguard

    一些公共的模板 一些自定义的模板 aar中增加独立的混淆配置 检查混淆和追踪异常 开启 proguard 功能,则每次构建时 proguard 都会输出下列文件: dump.txt 说明 apk 中所 ...

  4. android 常用 style,Android中 Styles和Themes

    部分内容摘自: http://blog.csdn.net/woshishushangdezhu/article/details/4602597 1.什么是Style,什么是Theme? 1) Styl ...

  5. android 常用注解,Android 开发小工具之:注解 Annotation

    Android Support 包之一的 support-annotations是通过静态编译检测来提高代码质量的一个注解工具.里面包含了 Android 开发中常用的代码检测注解,帮助开发者提高代码 ...

  6. android 常用命令,Android开发常用命令整理

    一些命令,不常用就忘记了,特整理在这里,忘了就查查.. ·        alias 用于定义和查询别名,但不保存.修改home目录下.bashrc保存定义别名格式,不加参数即查询别名:alias c ...

  7. Android知识补充(Android学习笔记)

    Android知识补充 ●国际化 所谓的国际化,就是指软件在开发时就应该具备支持多种语言和地区的功能,也就是说开发的软件能同时应对不同国家和地区的用户访问,并针对不同国家和地区的用户,提供相应的.符合 ...

  8. Android常用加密方式

    加密解密简介 加密技术是最常用的安全保密手段,利用技术手段把重要的数据变为乱码(加密)传送,到达目的地后再用相同或不同的手段还原(解密).加密技术包括两个元素:算法和密钥.算法是将普通的信息或者可以理 ...

  9. Android常用加密解密实现方式

    1.MD5,SHA1加密校验 MD5,SHA1等加密算法我们通常不用来做加密,因为解密成本非常大,我们一般用MD5,SHA1等用来做文件校验,唯一性校验等功能.常见的场景如防止别人恶意篡改我们的APP ...

最新文章

  1. 嵌入式和机械哪个好?机械转嵌入式好转吗?
  2. 1031 Hello World for U
  3. ACM的输入输出总结
  4. EL表达式和JSTL标准标签库
  5. 驰骋表单设计器 设计表单案例演示
  6. shell输出标准化xml
  7. SQL那些事儿(四)--oracle创建表空间、用户创建
  8. 【动态规划】完全背包:存钱罐(恰好装满)
  9. NTKO Weboffice打开文档格式错误的解决方案
  10. 工业面阵相机与源型PLC和漏型PLC外部触发接线
  11. html表单查重,毕业论文的表格会被查重吗?
  12. 战舰世界显示无法连接服务器失败,王美雪:战舰世界无法连接服务器解决方法 无法登陆怎么办...
  13. SSM+广西壮族文化宣传网站 毕业设计-附源码230932
  14. python网络爬虫——robots协议
  15. 04-VUE 常用指令最佳实践
  16. 视频知识普及:码率,分辨率,帧率,清晰度
  17. 嗨,我亲爱的朋友们!心存感恩1
  18. 【VBA研究】输出PDF文件合并时出错
  19. 怎么查看电脑主板最大支持多大的内存
  20. Spring中service层与dao(mapper)层

热门文章

  1. vxe-table checkbox range 实现复选框鼠标快速选择
  2. 系统辨识(六):最小二乘法的修正算法
  3. Flume使用Spooling Directory Source采集文件夹数据到hdfs
  4. OSPF网络类型以及不规则区域练习
  5. 直播绿幕抠图的例子(绿幕抠图直播实例参考)
  6. Java字节简单介绍
  7. NH2-PEG-MAL 氨基PEG马来酰亚胺
  8. 2015美亚杯团队赛
  9. Celery分布式任务队列学习记录
  10. html复制粘贴的文字自动换行,如何解决Word中粘贴网页上的文字自动换行的现象...