资讯专栏INFORMATION COLUMN

JAVA加密算法(5)- 数字签名算法(RSA、DSA)

RichardXG / 1939人阅读

摘要:数字签名流程生成签名对源文件的数字摘要,使用私钥加密,生成加密数字摘要验证签名对加密数字摘要通过公钥进行解密,生成数字摘要,比较数字摘要与数字摘要,结果相同则签名验证通过。

数字签名流程

(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

相关文章

  • 慕课网_《Java实现数字签名》学习总结

    时间:2017年4月13日星期四说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:https://github.com/zccodere/s...个人学习源码:https://github.com/zccodere/s... 第一章:概述 1-1 数字签名算法概述 数字签名算法 签名-安全性,抗否认性 数字签名:带有密钥(公钥、私钥)的消息摘要算法 验...

    gotham 评论0 收藏0
  • 2021年,用更现代的方法使用PGP(中)

    摘要:世界上有两种密码一种是防止你的小妹妹偷看你的文件另一种是防止当局阅读你的文件应用密码学上篇链接年,用更现代的方法使用上三安全使用和备份准备为了安全性,建议在一台断网的或者系统上生成你的密钥对。世界上有两种密码:一种是防止你的小妹妹偷看你的文件;另一种是防止当局阅读你的文件.​ ...

    Tecode 评论0 收藏0
  • 加密解密算法介绍

    摘要:加密解密算法介绍算法目前常见有加密算法,散列算法,编码算法,使用位关键字作为流加密算法加密技术通常分为两大类对称式和非对称式。对称性加密算法有用途对称加密算法用来对敏感数据等信息进行加密数据加密标准,速度较快,适用于加密大量数据的场合。 加密解密算法介绍 算法目前常见有: 加密算法,散列算法,Base64(编码算法),https(SSL使用40位关键字作为RC4流加密算法) 加密技术通...

    ThinkSNS 评论0 收藏0
  • JAVA加密算法(1)- 密码学概述及BASE64算法使用

    密码学综述 密码学基本功能 机密性、鉴别、报文完整性、不可否认性 基本模型 sender-->加密算法 --> 密文 --> 解密算法 --> receiver 密钥源 密码学算法分类: 消息编码:Base64 消息摘要:MD类,SHA类,MAC 对称加密:DES,3DES,AES 非对称加密:RSA,DH密钥交换 数字签名:RSA signature,DSA signature 密码学...

    sevi_stuo 评论0 收藏0
  • 使用Hutool处理RSA等非对称加密

    摘要:此文主要介绍利用简化非对称加密解密。对于非对称加密,最常用的就是和,在中使用对象来负责加密解密。用于向公钥所有者发布信息这个信息可能被他人篡改但是无法被他人获得。 介绍 Hutool工具是一个国产开源Java工具集,旨在简化Java开发中繁琐的过程,Hutool-crypto模块便是针对JDK加密解密做了大大简化。 此文主要介绍利用Hutool-crypto简化非对称加密解密。 对于非...

    bang590 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<