在线支付系列【4】支付安全之数字签名

news2024/11/15 16:45:01

有道无术,术尚可求,有术无道,止于术。

文章目录

    • 信息摘要
      • 摘要算法
      • 数据完整性
    • 数字签名
      • 签名流程
      • 验签流程
      • 实现代码

信息摘要

信息摘要就是一段数据的特征信息,当数据发生了改变,信息摘要也会发生改变,发送方会将数据和信息摘要一起传给接收方,接收方会根据接收到的数据重新生成一个信息摘要,若此摘要和接收到的摘要相同,则说明数据正确。

信息摘要是由哈希函数生成的

信息摘要原数据通过某个算法生成的一个固定长度的单向Hash散列值。特点:

  • 固定长度:不论原文内容多大,其生成的信息摘要都是固定长度的。
  • 不可重:任何不同的输入数据,都会产生不同的信息摘要。
  • 单向性:即只能由数据生成信息摘要,不能由信息摘要还原数据。

在这里插入图片描述

摘要算法

摘要算法又称哈希算法、散列算法。通过哈希函数,计算出数据的哈希值。

常用算法有:

  • MD:消息摘要算法
  • SHA:安全散列算法
  • Mac:消息认证码算法
算法输出长度(位)输出长度(字节)
SM3256 bits32 bytes
MD5128 bits16 bytes
SHA-1160 bits20 bytes
RipeMD-160160 bits20 bytes
SHA-256256 bits32 bytes
SHA-512512 bits64 bytes

基于JDK 的摘要算法实现:

    private static String getMd(String message) throws NoSuchAlgorithmException {
        // 获取消息摘要对象
        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        // 更新摘要,传入原文数据
        messageDigest.update(message.getBytes(StandardCharsets.UTF_8));
        // 运行获取摘要值
        byte[] result = messageDigest.digest();
        return Base64.getEncoder().encodeToString(result);
    }

数据完整性

可以使用信息摘要保证数据完整性,防止被篡改。
在这里插入图片描述
工作流程:

  1. 小明将信息进行摘要计算,将摘要标记在情书中发送给小红
  2. 小红收到信件后,对信息计算摘要,对比自己计算的摘要是否和情书中的一致,若不一致,则说明被篡改过,内容不可信

实现代码:

    public static void main(String[] args) throws Exception {
        // 获取信息摘要
        String message = "爱老虎油~";// 原文
        String md = getMd(message);

        // 验证数据完整性
        String sendUpdateMsg = "爱老虎油~哈哈";// 被篡改
        String mdUpdate = getMd(sendUpdateMsg);
        if (md.equals(mdUpdate)){
            System.out.println("摘要信息一致,未被篡改");
        }else {
            System.out.println("摘要信息不一致,被篡改");
        }

        String sendMsg = "爱老虎油~";// 未篡改
        String sendMd = getMd(sendMsg);
        if (md.equals(sendMd)){
            System.out.println("摘要信息一致,未被篡改");
        }else {
            System.out.println("摘要信息不一致,被篡改");
        }
    }

数字签名

上述流程还存在缺陷,如果情书被非法拦截,将篡改后的摘要附在信件上,小红收到后,使用被篡改的摘要进行对比,结果始终会一致,并不能发现数据已被篡改。

这个时候需要加入非对称加密,使用数字签名技术。

数字签名(Digital Signature),一般是附加在某一电子文档中的一组特定的符号或代码,用于表示签发者的身份以及签发者对电子文档的认可,并能被接收者用来验证该电子文档在传输过程中是否被篡改或伪造。

一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。数字签名是非对称密钥加密技术与数字摘要技术的应用。签名算法或签名密钥是秘密的,只有签名人掌握。验证算法是公开的,以便他人进行验证。

基于密码学的数字签名有着如下的优势:

  • 消息源认证性:数字签名可以表示签发者的身份,也就是说具有消息源认证性。

  • 不可否认性:数字签名生成时需要输入签名者私钥。换句话说,数字签名对应唯一签名主体,并且签名者需要承担不可推卸的责任,即数字签名可以实现不可否认性。

  • 消息完整性:数字签名可以检查电子文档在传输过程中是否被篡改或伪造,即保障消息完整性。

签名流程

首先生成非对称秘钥。
在这里插入图片描述
签名流程如下:

  1. 小明使用摘要算法对原文进行摘要计算,生成数据指纹(摘要)。
  2. 使用私钥将摘要进行加密,得到数字签名,并将其附在文档中,发送给小红
    在这里插入图片描述

验签流程

验签流程如下:

  1. 小红取出签名,使用公钥解密摘要,得要小明的摘要。
  2. 对文档进行摘要计算,对比两个摘要是否一致。
    在这里插入图片描述

还可以加入对称算法,对原文数据进行加密,安全性更高。

如果第三方冒充发送方发送了一个文件,因为接收方在对数字签名进行解密时使用的是发送方的公开密钥,只要第三方不知道发送方的私用密钥,解密出来的数字摘要与计算机计算出来的新摘要必然是不同的。这就提供了一个安全的确认发送方身份的方法。

实现代码

使用JDK实现数字签名:

        // 原文
        String message = "爱老虎油~";
        byte[] result = message.getBytes(StandardCharsets.UTF_8);
        String md = Base64.getEncoder().encodeToString(result);
        System.out.println("原文数据:" + md);

        // 2. 签名
        // 将私钥字符串转为私钥对象
        String privateKeyBase64 = "MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAwQLaA6koZPMJ0nh+Vvo6P1CZvBUA2bAufTMGRkg16kYR5ae85HGW15qRIrTc7ZeC0dIbJbivnbQoG28oRx0UAQIDAQABAkEAmQgjx6dFadTxQrlaoqe/qxfC7MdSZ0czdP0RyoPSi64k942Rj46in5zDw60SynysVvMmVinxPPFS+6rv5kIWaQIhAPMXt8l7jPGmF6pYTmE2cx9OjB4Q9q8uhfIKZc0E7T9HAiEAy0JkNwSVxK76I9mFZpoRSfH37xAqLyUKhdCRAn5fBncCIQDGw3Pg6Ia750SeYgnkbrL+vCjRRKmPX4jh+SJ32jlqbQIgIXe6FpELtAn3qAV+AKnnpNxRraxktcSMmgIAjn+OV/sCIFlpFzkKXkW2cTv6oVHbFkqgrDPhTAXbshsa/U301Oac";
        PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyBase64));
        KeyFactory privateKeyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKeyByValue = privateKeyFactory.generatePrivate(privateKeySpec);
        // 实例化签名对象
        Signature signature = Signature.getInstance("MD5withRSA");
        // 初始化 传入私钥
        signature.initSign(privateKeyByValue);
        // 更新签名,传入摘要值
        signature.update(Base64.getDecoder().decode(md));
        // 签名,获取签名
        byte[] enSign = signature.sign();
        String singData = Base64.getEncoder().encodeToString(enSign);
        System.out.println("签名数据:" + singData);


        // 验签
        // 将公钥字符串转为公钥对象
        String publicKeyBase64 = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMEC2gOpKGTzCdJ4flb6Oj9QmbwVANmwLn0zBkZINepGEeWnvORxlteakSK03O2XgtHSGyW4r520KBtvKEcdFAECAwEAAQ==";
        X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyBase64));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKeyByValue = keyFactory.generatePublic(bobPubKeySpec);
        // 实例化 签名对象
        Signature verifySignature = Signature.getInstance("MD5withRSA");
        // 初始化,传入公钥
        verifySignature.initVerify(publicKeyByValue);
        // 更新签名,传入签名前摘要数据
        verifySignature.update(Base64.getDecoder().decode(md));
        // 验证,传入签名数据
        boolean verify = verifySignature.verify(Base64.getDecoder().decode(singData));
        System.out.println("验签结果:" + verify);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/171886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

12月知识小报|线上问题的抽丝剥茧与一锤定音

海恩法则是德国飞机涡轮机的发明者帕布斯海恩提出的一个在航空界关于飞行安全的法则。每一起严重事故的背后,必然有29次轻微事故和300起未遂先兆以及1000起事故隐患。作为开发者,安全生产是我们底线,敬畏每一行代码,挖掘每一个故障…

LINUX学习之文件基本属性(二)

查看文件属性 Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位并拥有不同的权限。在 Linux 系统中,通常使用 chown 命令来修改文件或目录的所有者,chmod 命令则用于设置用户的权限。 chown (change owner) :用于修改…

Linux下的进程通信之system V共享内存

目录 使用system V共享内存进行进程间通信: 获取共享内存shmget 将共享内存关联到进程 去关联共享内存 删除共享内存 简易模拟实现server和client之间的通信: 服务端代码: 客户端代码: 共享内存的特点: 其他…

solrCloud一:zookeeper集群搭建

SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作为集群的配置信息中心。SolrCloud是Solr的一种分布式部署方式 ,当索引越来越大时,一个单一的系统无法满足空间和查询效率上的要求,这个时候往往需要…

SpringCloud(11):Hystrix请求合并

1 简介 如图,多个客户端发送请求调用(消费者)项目中的findOne方法,这时候在这个项目中的线程池中会发申请与请求数量相同的线程数,对EurekaServiceProvider(服务提供者)的getUserById方法发起调用,每个线程都要调用一次&#xff0…

圆满落幕!56 人参加,龙蜥社区技术委员会、运营委员会会议顺利完成

1 月 13 日,龙蜥社区分别召开了第 10 次技术委员会会议和第 14 次运营委员会会议,来自 21 家理事单位的委员代表出席。两个会上分别总结和回顾了龙蜥社区 2022 年度整体技术和运营发展情况,就社区产品、重要技术决策、社区治理、2023 年度运营…

塔望3W消费战略全案丨火出天际的预制菜,能否拯救开饭焦虑?

2022年6月塔望咨询开设塔望食品大健康消费研究院(简称塔望食研院)栏目,塔望食研院以“为食品行业品牌高质量发展赋能”为理念,将不定期发布食品大健康行业研究、消费研究报告。塔望食研院致力于结合外部数据、消费调研数据、企业内…

Web(九)

Web服务器软件Tomcat web服务器软件: 服务器:安装了服务器软件的计算机 服务器软件:接收用户的请求,处理请求,做出响应 web服务器软件:接收用户的请求,处理请求,做出响应。 在…

说话人识别损失函数的PyTorch实现与代码解读

概述 说话人识别中的损失函数分为基于多类别分类的损失函数,和端到端的损失函数(也叫基于度量学习的损失函数),关于这些损失函数的理论部分,可参考说话人识别中的损失函数本文主要关注这些损失函数的实现,…

SQL 分组条件深入剖析

问题在 stackoverflow 网站上看到这样一个 SQL 分组条件的需求,需求看似挺简单,但能把 SQL 写正确对于新手来说也不容易,我们拿过来深入剖析一下,数据如下:需求是查找只有Ready 状态的设备。解答自然思路:按…

寅辞旧岁,卯定常虹丨ASKO洗碗机“净”护新春团圆时刻

农历新年是一年中最重要的节日,但过去三年的特殊时光阻碍了很多人的归乡之行,如今当阴霾逐渐散去,必然会引来大规模的新年归乡潮,奔赴一个久违的团圆年。美馔佳宴是新春佳节的永恒命题,新年家里少不了亲友的光临&#…

Windows 7的最后一个版本

前天推送的文章介绍了,在1月10日微软发布了最后一个补丁后,微软为Windows7提供的所有更新(包括收费的ESU)已经完全终止。以后再有新的补丁,则为第三方平台提供的非官方版的了。 早在2022年9月份,微软就发布了支持安全启动UEFI的补…

DocPrompt代码实现与模型微调

数据预处理阶段 PaddleOCR PP-Structure:这个库其实是用于版面分析的一个开源库,参见:github: Layout-Parser/layout-parserhttps://github.com/Layout-Parser/layout-parser 代码推理阶段 Paddle-Inferencehttps://paddle-inference.readt…

图形编辑器:工具管理和切换

大家好,我是前端西瓜哥。今天我们看看对于一款图形编辑器,应该怎么去实现工具,比如绘制矩形、选中工具,以及如何去管理它们的。 项目地址,欢迎 star: https://github.com/F-star/suika 线上体验&#xff1a…

【改进篇】Python实现VRP常见求解算法——蚁群算法(ACO)

基于python语言,实现经典蚁群算法(ACO)对车辆路径规划问题(CVRP)进行求解, 优化代码结构,改进Split函数 目录往期优质资源1. 适用场景2. 改进效果对比2.1实验结果2.2 改进前后算法性能对比3. 求…

臻图信息构建数字孪生港口船舶停靠管理系统,赋能港口创新发展

我国的港口不仅是船只停靠的避风港,也是现代渔业发展和管理的中心。随着国内港口业的不断发展,国务院在《现代综合运输体系发展“十四五”规划》中提出,要自动化、数字化、智能化等技术来完善监管体系建设。 ​ 随着科技兴港战略的提出&…

“零”代码改动,静态编译让太乙Stable Diffusion推理速度翻倍

作者|梁德澎 AI 作图领域的工具一直不尽人意,直到去年 8 月 Stable Diffusion 开源,成为AI 图像生成领域无可争辩的划时代模型。 为了提升其推理效率,OneFlow 首度将 Stable Diffusion 模型加速至“一秒出图”时代,极…

2023牛客寒假算法基础集训营2(11/12)

Tokitsukaze and abn (easy)Tokitsukaze and abn (medium)要使abn&#xff0c;那么转换一下就是bn-a&#xff0c;所以只需要计算[n-L,n-R]和[L,R]相交的部分即可AC代码&#xff1a;#include <bits/stdc.h> using namespace std; using LL long long; int main() {ios::s…

6. 基本数据类型

1. Python 中的变量不需要声明 每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。在 Python 中&#xff0c;变量就是变量&#xff0c;它没有类型&#xff0c;我们所说的"类型"是变量所指的内存中对象的类型。 counter 100 # 整型 mile…

关于Win11打开文档总是提示“选择一个程序打开”的问题

这边异常情况&#xff1a; 使用的360浏览器下载回来的文档、微信下载回来的文档都会出现标题所说的问题。 问题产生的原因&#xff1a; 初期在重装电脑后&#xff0c;将自带的一些安装系统后的第三方软件卸载掉了&#xff0c;也包括QQ浏览器。 可是在win11默认应用中看到了…