Android面试题-Java安全专题五

Android程序员面试宝典

安全专题

1.5 数字签名

数字签名是非对称加密与数字摘要的组合应用

1.5.1 应用场景

  1. 校验用户身份(使用私钥签名,公钥校验,只要用公钥能校验通过,则该信息一定是私钥持有者发布的)
  2. 校验数据的完整性(用解密后的消息摘要跟原文的消息摘要进行对比)

1.5.2 签名过程

“发送报文时,发送方用一个哈希函数从报文文本中生成报文摘要,然后用自己的私人密钥对这个摘要进行加密,这个加密后的摘要将作为报文的数字签名和报文一起发送给接收方,接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要,接着再用发送方的公用密钥来对报文附加的数字签名进行解密,如果这两个摘要相同、那么接收方就能确认该数字签名是发送方的。
数字签名有两种功效:一是能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。二是数字签名能确定消息的完整性。因为数字签名的特点是它代表了文件的特征,文件如果发生改变,数字摘要的值也将发生变化。不同的文件将得到不同的数字摘要。 一次数字签名涉及到一个哈希函数、发送者的公钥、发送者的私钥。”

《Android面试题-Java安全专题五》

1.5.3 使用步骤

//获取signature对象,初始化算法:MD2withRSA, MD5withRSA, or SHA1withRSA            

Signature signature = Signature.getInstance("MD5withRSA");
//创建私钥(从磁盘上读取)
PrivateKey  privateKey = (PrivateKey)SerializableUtil.readObject(
"heima.privateKey");
//使用私钥进行初始化
signature.initSign(privateKey);
//传入需要签名的数据
signature.update(content.getBytes());
//执行签名
byte[] sign = signature.sign();
//创建公钥(从磁盘上读取)
PublicKey publicKey = (PublicKey) SerializableUtil.readObject(
    "heima.publicKey");
//使用公钥进行初始化
signature.initVerify(publicKey);
//传入需要校验的数据(即上面的原文)
signature.update(content.getBytes());
//执行校验
boolean verify = signature.verify(sign);

1.5.4 总结

数字签名一般不单独使用,基本都是用在数字证书里实现SSL通信协议。下面将学习的数字证书就是基于数字签名技术实现的。

  • 欢迎关注微信公众号、长期为您推荐优秀博文、开源项目、视频

  • 微信公众号名称:Android干货程序员

  • 《Android面试题-Java安全专题五》
    原文作者:马伟奇
    原文地址: https://www.jianshu.com/p/259be50a79e3
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞