密码学Android技术知识Android知识

Java/Android加密相关

2017-03-05  本文已影响597人  花京院典明

最近在看HTTPS,其核心还是基与Rsa加密的SSL/TSL,所以整理一下在Android开发中常见的几种加密方式

MD5加密

MD5英文全称Message-Digest Algorithm 5,全称消息算法摘要,是一种不可逆加密方式

特点

因为其特点,MD5加密通常用来验证文件的完整性,防串改.

实现

在Java中提供了MessageDigest类来加密数据.

byte[] resource; //需要加密的数据
MessageDigest md5=MessageDigest.getInstance("MD5");
byte[] bytes=md5.digest(resource);
StringBuilder builder=new StringBuilder(bytes.lenght);
for (byte byte :bytes ) {
 String temp = Integer.toHexString(b & 0xff);
 if (temp.lenght==1) {
     builder.append(0);
 }
    builder.append(temp);
}
String MD5=builder.toString();

MD5加密是对字节数组进行操作的.所以无论加密文件或是其它都需要先转换为字节数组.加密后的结果也是字节数组.
为了方便查看,需要按规定转换为字节数组.

BASE64

BASE64并不是一种加密方式,而是对字节数组的一种编码方式.实际上是让字节数据转换为文本的方案.

原理

BASE64是把字节数据转换为ASC码中对应的64个字符(英文大小写,+及/).
转换方式为每6位字节对应一个字符.不足位的后面补0.6位字节转换为十进制数值.范围是0-63,对应64个字符.如果有不足位的,在编码后会补上数量对应的=

用处

实现

在Java中提供了Base64类来实现编码转换

//编码
String encode= Base64.encode(byte[] bytes,int flag);
//解码
byte[] decode=Base64.decode(byte[] bytes,int flag);

flag表示编码方式,通常使用Base64.DEFAULT

AES

Advanced Encryption Standard,全称为高级加密标准,又称为 Rijndael 加密法,使用的是区块加密方案.
区块加密方案是把一定数量的字节划分为一个区块,把区块内的数据加密成相同位数的数据
AES是一种对称加密方案,所以需要加密端和解密端都使用相同的密钥.

特点

实现

在Java中通过MessageDigest来进行AES加解密

//密钥原数据字符串,两端必须一样,128位的密钥字符串长度必须为16
private static final String KEY=""
//加密方式,AES表示AES加密,CBC表示区块的处理方式,PKC5Padding表示区块的填充方式.
private static final String MODE="AES/CBC/PKCS5Padding"

//生成密钥
KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY);
SecretKey secretKey = keyGenerator.generateKey();
//初始化密码处理类
Cipher cipher = Cipher.getInstance(MODE);
cipher.init(Cipher.ENCRIPT_MODE,secretKey);  //第一个参数为模式,ENCRIPT_MODE为加密, DECRIPT为解密
//cipher.init(Cipher.DECRIPT_MODE,secretKey,"BC");  使用`PKCS7Padding`方式时需要加载bouncycastle包,BC为提供该填充方式的Provicer
byte[] date=cipher.doFinal(byte[] data); //加密和解密都是同一个方法,由初始化的模式决定.对源字节数组进行处理.生成新的字节数组.

填充方式有几种.Java6没有实现所有的填充方式.

生成密钥时,getInstance()有个重载的方法可以添加一个provier.为密钥添加一个随机数.
AES加密安全性高,速度快.

DES

Data Encryption Standard,标准加密算法.使用64位密钥的对称加密.使用的也是区块加密方案.
因为是64位密钥,安全性不高,现已经被AES加密替代.
实现方法同AES加密,只需要把MODE中的AES改为DES

RSA

目前使用最广泛的非对称加密.生成一对密钥--公钥和私钥.公钥对来对外提供.私钥只有密钥生成者自己拥有
非对称算法需要指定密钥长度,越长安全性越好,但加解密的速度就越慢.通常指定1024或2048.
一次加密的的密文长度为密钥长度/8-11,所以1024长度的密钥一次只能加密117字节.2048能加密245字节.
所以非对称加密通常只用与短数据加密,如签名或对称加密的密钥.
RSA加密都是一用与一对多的场景.
RSA有两种使用方式

RSA的密钥的产生

RSA的原理

实现

定义常量

private static final KEY_SIZE=1024;
private static final RSA="RSA";
private static final MODE="RSA/ECB/PCKS1Padding"

这里注意RSA的加密填充方式,需要两端保持一至.
在Adrioid中默认使用的是RSA/None/NoPadding,在Java中使用的是RSA/None/PCKS1Padding.

创建密钥

KeyPairGenerator rsa = KeyPairGenerator.getInstance(RSA);
rsa.initialize(KEY_SIZE);
KeyPair keyPair = rsa.generateKeyPair();
Key publicKey = keyPair.getPublic();
byte[] publicKeyEncoded = publicKey.getEncoded();
Key privateKey = keyPair.getPrivate();
byte[] privateKeyEncoded = privateKey.getEncoded();

把字节数组转换为Key

公钥会以字节数组的形式公开.接收方需要把字节数据转化为公钥

//公钥公开的方式为X509
KeySpec KeySpec = new X509EncodedKeySpec(publicKeyEncoded);
PublicKey publicKey = keyFactory.generatePublic(keySpec);
//私钥公开的方式为PKCS8
KeySpec keySpec = new PKCS8EncodedKeySpec(publicKeyEncoded);
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);

加解密

通常使用公钥加密,使用私钥解密.还是使用Cipher

Cipher cipher=Cipher.instance(MODE);
//使用公钥加密
cipher.init(Cipher.ENCRIPT_MODE,publicKey);
cipher.doFinal();
//使用私钥解密
cipher.init(Cipher.DECRIPT_MODE,privateKey);
cipher.doFinal();

SSL

安全套接字(Secure Socket Layer,SSL)协议是Web浏览器与Web服务器之间安全交换信息的协议,提供两个基本的安全服务:鉴别与保密。

SSL是间与应用层与TCP层.应用数据经过SSL层加密并加上SSL头传输给TCP层.

SSL通信流程

握手协议

证书

证书是一台服务器对外提供的一个身份证明.需要通过可靠的第三方认证机构(CA)来发布.
一个数字证书通常有以下几项

证书的验证

一般的浏览器都会有CA根证书,含有所有CA的公钥

TSL

TLS 1.0是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本,可以理解为SSL 3.1

原文地址

上一篇下一篇

猜你喜欢

热点阅读