摘要:数字签名流程生成签名对源文件的数字摘要,使用私钥加密,生成加密数字摘要验证签名对加密数字摘要通过公钥进行解密,生成数字摘要,比较数字摘要与数字摘要,结果相同则签名验证通过。
数字签名流程
(1)生成签名:对源文件的「数字摘要」,使用私钥加密,生成「加密数字摘要」;
(2)验证签名:对「加密数字摘要」通过公钥进行解密,生成「数字摘要2」,比较「数字摘要」与「数字摘要2」,结果相同则签名验证通过。
概念:带有「公钥」和「私钥」的「消息摘要」算法,是「非对称加密算法」和「消息摘要」算法的结合体
常用签名算法私钥签名,公钥验证
RSASignature
DSASignature
ECDSASignature(需Bouncy Castle)
数字签名作用验证数据完整性
认证数据来源
抗否认
场景如Android App开发者签名
RSASignature示例import java.security.*; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; public class RSASignatureUtil { public static final String KEY_ALGORITHM = "RSA";//密钥算法 public static final String SIGN_ALGORITHM = "MD5withRSA";//签名算法:MD2withRSA,SHA1WithRSA,SHA256withRSA,SHA384withRSA,SHA512withRSA /** * 初始化RSA公钥私钥 */ public static KeyPair initKey() throws Exception{ KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM); keyPairGenerator.initialize(1024); return keyPairGenerator.generateKeyPair(); } /** * 签名(原数据,私钥 2要素) */ public static byte[] sign(byte[] data, PrivateKey privateKey) throws Exception{ PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey.getEncoded()); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); PrivateKey priKey = keyFactory.generatePrivate(keySpec); Signature signature = Signature.getInstance(SIGN_ALGORITHM); signature.initSign(priKey); signature.update(data);//设置要计算的数据 return signature.sign(); } /** * 校验签名(元数据,公钥,签名 三要素) */ public static boolean valid(byte[] data, byte[] publicKey, byte[] sign) throws Exception{ KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey); PublicKey pubKey = keyFactory.generatePublic(keySpec); Signature signature = Signature.getInstance(SIGN_ALGORITHM); signature.initVerify(pubKey); signature.update(data); return signature.verify(sign); } public static void main(String[] args) throws Exception { String data = "123456"; KeyPair keyPair = initKey(); byte[] sign = sign(data.getBytes(),keyPair.getPrivate()); boolean isValid = valid(data.getBytes(),keyPair.getPublic().getEncoded(),sign); System.out.println(isValid); } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/65220.html
时间:2017年4月13日星期四说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:https://github.com/zccodere/s...个人学习源码:https://github.com/zccodere/s... 第一章:概述 1-1 数字签名算法概述 数字签名算法 签名-安全性,抗否认性 数字签名:带有密钥(公钥、私钥)的消息摘要算法 验...
摘要:世界上有两种密码一种是防止你的小妹妹偷看你的文件另一种是防止当局阅读你的文件应用密码学上篇链接年,用更现代的方法使用上三安全使用和备份准备为了安全性,建议在一台断网的或者系统上生成你的密钥对。世界上有两种密码:一种是防止你的小妹妹偷看你的文件;另一种是防止当局阅读你的文件. ...
密码学综述 密码学基本功能 机密性、鉴别、报文完整性、不可否认性 基本模型 sender-->加密算法 --> 密文 --> 解密算法 --> receiver 密钥源 密码学算法分类: 消息编码:Base64 消息摘要:MD类,SHA类,MAC 对称加密:DES,3DES,AES 非对称加密:RSA,DH密钥交换 数字签名:RSA signature,DSA signature 密码学...
摘要:此文主要介绍利用简化非对称加密解密。对于非对称加密,最常用的就是和,在中使用对象来负责加密解密。用于向公钥所有者发布信息这个信息可能被他人篡改但是无法被他人获得。 介绍 Hutool工具是一个国产开源Java工具集,旨在简化Java开发中繁琐的过程,Hutool-crypto模块便是针对JDK加密解密做了大大简化。 此文主要介绍利用Hutool-crypto简化非对称加密解密。 对于非...
阅读 829·2021-11-25 09:44
阅读 1020·2021-11-19 09:40
阅读 6854·2021-09-07 10:23
阅读 1924·2019-08-28 17:51
阅读 1073·2019-08-26 10:59
阅读 1890·2019-08-26 10:25
阅读 3068·2019-08-23 18:22
阅读 835·2019-08-23 16:58