欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 安全加密:消息摘要Message Digest详解

程序员文章站 2024-03-06 14:50:50
android安全加密专题文章索引 android安全加密:对称加密 android安全加密:非对称加密 android安全加密:...

android安全加密专题文章索引

  1. android安全加密:对称加密
  2. android安全加密:非对称加密
  3. android安全加密:消息摘要message digest
  4. android安全加密:数字签名和数字证书
  5. android安全加密:https编程

以上学习所有内容,对称加密、非对称加密、消息摘要、数字签名等知识都是为了理解数字证书工作原理而作为一个预备知识。数字证书是密码学里的终极武器,是人类几千年历史总结的智慧的结晶,只有在明白了数字证书工作原理后,才能理解https 协议的安全通讯机制。最终才能在ssl 开发过程中得心应手。

另外,对称加密和消息摘要这两个知识点是可以单独拿来使用的。

知识点串联:

数字证书使用到了以上学习的所有知识

  1. 对称加密与非对称加密结合使用实现了秘钥交换,之后通信双方使用该秘钥进行对称加密通信。
  2. 消息摘要与非对称加密实现了数字签名,根证书机构对目标证书进行签名,在校验的时候,根证书用公钥对其进行校验。若校验成功,则说明该证书是受信任的。
  3. keytool 工具可以创建证书,之后交给根证书机构认证后直接使用自签名证书,还可以输出证书的rfc格式信息等。
  4. 数字签名技术实现了身份认证与数据完整性保证。
  5. 加密技术保证了数据的保密性,消息摘要算法保证了数据的完整性,对称加密的高效保证了数据处理的可靠性,数字签名技术保证了操作的不可否认性。

通过以上内容的学习,我们要能掌握以下知识点:

  1. 基础知识:bit 位、字节、字符、字符编码、进制转换、io
  2. 知道怎样在实际开发里怎样使用对称加密解决问题
  3. 知道对称加密、非对称加密、消息摘要、数字签名、数字证书是为了解决什么问题而出现的
  4. 了解ssl 通讯流程
  5. 实际开发里怎样请求https 的接口

1. 常见算法

md5、sha、crc 等

2. 使用场景

  1. 对用户密码进行md5 加密后保存到数据库里
  2. 软件下载站使用消息摘要计算文件指纹,防止被篡改
  3. 数字签名(后面知识点)
  4. 百度云,360网盘等云盘的妙传功能用的就是sha1值
  5. eclipse和android studio开发工具根据sha1值来判断v4,v7包是否冲突
  6. 据说银行的密码使用的就是md5加密(因为md5具有不可逆性)

例如软件下载站数据指纹:http://dev.mysql.com/downloads/installer/

Android 安全加密:消息摘要Message Digest详解

3. 使用步骤

//常用算法:md5、sha、crc
messagedigest digest = messagedigest.getinstance("md5");
byte[] result = digest.digest(content.getbytes());
//消息摘要的结果一般都是转换成16 进制字符串形式展示
string hex = hex.encode(result);
//md5 结果为16 字节(128 个比特位)、转换为16 进制表示后长度是32 个字符
//sha 结果为20 字节(160 个比特位)、转换为16 进制表示后长度是40 个字符
system.out.println(hex);

消息摘要后的结果是固定长度,无论你的数据有多大,哪怕是只有一个字节或者是一个g 的文件,摘要后的结果都是固定长度。

经常听到有人问这样的问题,md5 摘要后结果到底是多少位?有的人说是16 位,有的说是128 位,有的说是32 位。到底是多长,这个时候我们就要明白,16 位指的是字节位数,128 位指的是比特位,32 位指的结果转换成16 进制展示的字符位数。

4. 数字摘要原理

//获取实例
messagedigest digest = messagedigest.getinstance("md5");
digest.update(key.getbytes());
byte[] bytes = digest.digest(key.getbytes());
stringbuilder sb = new stringbuilder();
for (int i = 0; i < bytes.length; i++) {
 string hex = integer.tohexstring(bytes[i]&0xff);
 if (hex.length() == 1){
 sb.append("0");
 }
 sb.append(hex);
}
string hexstring = sb.tostring();