密码学【java】初探究加密方式之数字签名

news2024/9/24 13:25:32

文章目录

  • 前言
    • 1 数字签名简介
    • 2 基本原理
    • 3 数字证书
    • 4 网页加密
    • 5 edge的网站连接图标
    • 6 代码实现
    • 7 keytool工具使用
      • 7.1 常用命令:
      • 7.2 生成私钥公钥[未实践成功]
      • 7.3 导出公钥

前言

  • 有关keytool的使用部分,未实现,先记录下来!!

1 数字签名简介

  • 数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。
  • 它是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术来实现的,用于鉴别数字信息的方法。
  • 一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。
  • 数字签名是非对称密钥加密技术与数字摘要技术的应用。

  • 数字签名的含义是:在网络中传输数据时候,给数据添加一个数字签名,表示是谁发的数据,而且还能证明数据没有被篡改。

2 基本原理

话说张三有俩好哥们A、B。由于工作原因,张三和A,B写邮件的时候为了安全都需要加密。于是张三想到了数字签名:

  • 第一步:加密采用非对称加密,张三有三把钥匙,两把公钥,送给朋友。一把私钥留给自己。
  • 第二步:A或者B写邮件给张三:A先用公钥对邮件加密,然后张三收到邮件之后使用私钥解密。
  • 第三步:张三写邮件给A或者B:
    1. 张三写完邮件,先用hash函数生成邮件的摘要,附着在文章上面,这就完成了数字签名,然后张三再使用私钥加密,就可以把邮件发出去。
    2. A或者是B收到邮件之后,先把数字签名取下来,然后使用自己的公钥解密即可。这时候取下来的数字签名中的摘要若和张三的一致,那就认为是张三发来的,再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。
      在这里插入图片描述

在这里插入图片描述

3 数字证书

在这里插入图片描述

  • 对签名进行验证时,需要用到公钥。如果公钥是伪造的,那我们无法验证数字签名了,也就根本不可能从数字签名确定对方的合法性了。这时候证书就闪亮登场了。我们可能都有考各种证书的经历,比如说普通话证书,四六级证书等等,但是归根结底,到任何场合我们都能拿出我们的证书来证明自己确实已经考过了普通话,考过了四六级。这里的证书也是同样的道理。
  • 证书的生成
    在这里插入图片描述

4 网页加密

一个应用“数字证书”的实例:https协议。这个协议主要用于网页加密

  • 首先,客户端向服务器发出加密请求。
    在这里插入图片描述
  • 服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。
    在这里插入图片描述
  • 客户端(浏览器)的“证书管理器”,有“受信任的根证书颁发机构”列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。
  • 如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。
    在这里插入图片描述

5 edge的网站连接图标

  • Microsoft Edge 浏览 Web 时,地址栏中会显示一个图标,指示与要访问的网站的连接的安全性。 此图标可帮助您确定是否可以安全发送和接收网站的信息。 连接会告知发送到站点和从站点发送的信息(如密码、地址或信用卡)是否安全发送,且无法被攻击者截获。 该连接不会告知站点信誉。 但是,如果地址是已知的钓鱼或恶意软件网站,Microsoft Defender SmartScreen 将确定并指示该地址。
  • 地址栏中的连接图标具有四种不同的状态。 以下信息说明了每种状态的含义,并提供有关如何为浏览做出智能决策的提示:
    • 连接安全 (有效的证书)
      在这里插入图片描述
    • 没有完全安全 (证书证书)
      在这里插入图片描述
    • 过期的安全配置 (无效、已过期、自签名)
      在这里插入图片描述
    • 可疑或危险网站 (网络仿冒或恶意软件)
      在这里插入图片描述

6 代码实现

package com.atguigu.Signature;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.nio.charset.Charset;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

public class SignatureDemo {
    public static void main(String[] args) throws Exception {
        String a = "123";

        PublicKey publicKey = getPublicKey( "a.pub","RSA");
        PrivateKey privateKey = getPrivateKey("a.pri","RSA");

        String signaturedData = getSignature(a, "sha256withrsa", privateKey);

        boolean b = verifySignature(a, "sha256withrsa", publicKey, signaturedData);
        System.out.println(b);

    }

    /**
     * 读取公钥
     * @param publicPath 公钥路径
     * @param algorithm  算法
     * @return
     */
    public static PublicKey getPublicKey(String publicPath, String algorithm) throws Exception{
        String publicKeyString = FileUtils.readFileToString(new File(publicPath), Charset.defaultCharset());
        // 创建key的工厂
        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
        // 创建公钥规则
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyString));
        return keyFactory.generatePublic(keySpec);
    }

    /**
     *  读取私钥
     * @param priPath 私钥的路径
     * @param algorithm 算法
     * @return 返回私钥的key对象
     */
    public static PrivateKey getPrivateKey(String priPath, String algorithm) throws Exception{
        String privateKeyString = FileUtils.readFileToString(new File(priPath), Charset.defaultCharset());
        // 创建key的工厂
        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
        // 创建私钥key的规则
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyString));
        // 返回私钥对象
        return keyFactory.generatePrivate(keySpec);
    }

    /**
     * 生成签名
     *
     * @param input      : 原文
     * @param algorithm  : 算法
     * @param privateKey : 私钥
     * @return : 签名
     * @throws Exception
     */
    private static String getSignature(String input, String algorithm, PrivateKey privateKey) throws Exception {
        // 获取签名对象
        Signature signature = Signature.getInstance(algorithm);
        // 初始化签名
        signature.initSign(privateKey);
        // 传入原文
        signature.update(input.getBytes());
        // 开始签名
        byte[] sign = signature.sign();
        // 对签名数据进行Base64编码
        return Base64.encodeBase64String(sign);
    }

    /**
     * 校验签名
     *
     * @param input          : 原文
     * @param algorithm      : 算法
     * @param publicKey      : 公钥
     * @param signaturedData : 签名
     * @return : 数据是否被篡改
     * @throws Exception
     */
    private static boolean verifySignature(String input, String algorithm, PublicKey publicKey, String signaturedData) throws Exception {
        // 获取签名对象
        Signature signature = Signature.getInstance(algorithm);
        // 初始化签名
        signature.initVerify(publicKey);
        // 传入原文
        signature.update(input.getBytes());
        // 校验数据
        return signature.verify(Base64.decodeBase64(signaturedData));
    }
}

7 keytool工具使用

  • keytool工具路径:C:\Program Files\Java\jdk-19\bin
    在这里插入图片描述

7.1 常用命令:

  1. 生成keypair
    keytool -genkeypair
    keytool -genkeypair -alias lisi(后面部分是为证书指定别名,否则采用默认的名称为mykey)
    
  2. 查看keystore中项目:
    keytool -list或keytool -list -v
    keytool -exportcert -alias lisi -file lisi.cer
    
  3. 生成可打印的证书:
    keytool -exportcert -alias lisi -file lisi.cer –rfc
    
  4. 显示数字证书文件中的证书信息:
    keytool -printcert -file lisi.cer
    
    • 直接双击lisi.cer,用window系统的内置程序打开lisi.cer

7.2 生成私钥公钥[未实践成功]

  1. 生成密钥证书 下边命令生成密钥证书,采用RSA 算法每个证书包含公钥和私钥
keytool -genkeypair -alias guigu -keyalg RSA -keypass guigugu -keystore guigu.jks -storepass guigugu
  • Keytool 是一个java提供的证书管理工具

    -alias:密钥的别名 
    -keyalg:使用的hash算法 
    -keypass:密钥的访问密码 
    -keystore:密钥库文件名,xc.keystore保存了生成的证书 
    -storepass:密钥库的访问密码 
    
  1. 查询证书信息
    keytool -list -keystore guigu.jks
    
  2. 删除别名
    keytool -delete -alias guigu -keystore guigu.jsk
    

7.3 导出公钥

  • openssl是一个加解密工具包,这里使用openssl来导出公钥信息。
  • 安装 openssl
  1. 安装资料目录下的Win64OpenSSL-1_1_0g.exe,配置openssl的path环境变量,如下图:
    在这里插入图片描述
  • cmd进入guigu.jks文件所在目录执行如下命令(如下命令在windows下执行,会把-变成中文方式,请将它改成英文的-):
keytool -list -rfc --keystore guigu.jks | openssl x509 -inform pem -pubkey
  • 下面段内容是公钥
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvFsEiaLvij9C1Mz+oyAm
t47whAaRkRu/8kePM+X8760UGU0RMwGti6Z9y3LQ0RvK6I0brXmbGB/RsN38PVnh
cP8ZfxGUH26kX0RK+tlrxcrG+HkPYOH4XPAL8Q1lu1n9x3tLcIPxq8ZZtuIyKYEm
oLKyMsvTviG5flTpDprT25unWgE4md1kthRWXOnfWHATVY7Y/r4obiOL1mS5bEa/
iNKotQNnvIAKtjBM4RlIDWMa6dmz+lHtLtqDD2LF1qwoiSIHI75LQZ/CNYaHCfZS
xtOydpNKq8eb1/PGiLNolD4La2zf0/1dlcr5mkesV570NxRmU1tFm8Zd3MZlZmyv
9QIDAQAB
-----END PUBLIC KEY-----
  • 将上边的公钥拷贝到文本public.key文件中,合并为一行,可以将它放到需要实现授权认证的工程中。

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

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

相关文章

『python爬虫』12. 模拟登陆之cookie的使用(保姆级图文)

目录 session1. 模拟登陆取得cookie2. 在登录的情况下继续取得书架上的数据3. 在已经有cookie的情况下直接请求总结 欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏,持续更新中 session session和我们之前用的request十分相似&…

AWS Lambda - 同步/异步调用,事件源,目标

Hello大家好,我们今天继续讨论AWS Lambda的内容。 同步调用 Lambda函数有三种调用方式。 第一种方式是同步调用。 当我们使用API、CLI以及API网关等调用函数时,就是同步调用。 当您同步调用函数时,Lambda会运行该函数并等待响应&#xff…

微服务---Redis入门篇-Redis的常见命令和客户端使用

Redis快速入门 Redis的常见命令和客户端使用 1.初识Redis Redis是一种键值型的NoSql数据库,这里有两个关键字: 键值型 NoSql 其中键值型,是指Redis中存储的数据都是以key、value对的形式存储,而value的形式多种多样&#xf…

易视腾iS-E5-NGH_3798MV100_MT7601_卡刷固件包_当贝纯净桌面

易视腾iS-E5-NGH_3798MV100_MT7601_卡刷固件包_当贝纯净桌面 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置的没用的软件&#xff0…

单链表OJ题:LeetCode--206.反转链表

朋友们、伙计们,我们又见面了,今天给大家带来的是LeetCode中206题:反转链表 数 据 结 构:数据结构专栏 作 者:stackY、 C 语 言 :C语言专栏 LeetCode :LeetCode刷题训练营 LeetCod…

TiDB实战篇-数据库热点问题

形成热点的原因 主要是因为数据插入进去的时候是按顺序加数据的。 数据分裂以后还是在一个store上面,就会形成读写热点。 没有走索引全表扫描的情况。 定位热点 如果有热点,那么它的查询语句应该是比较多的,容易在这个地方找到对应的热点问…

Leetcode434. 字符串中的单词数

Every day a leetcode 题目来源:434. 字符串中的单词数 解法1:istringstream 我们知道,C默认通过空格(或回车)来分割字符串输入,即区分不同的字符串输入。 istringstream类用于执行C风格的串流的输入操…

Flowable入门

Flowable初体验 Flowable是什么 Flowable 是一个使用 Java 编写的轻量级业务流程引擎,常用于需要人工审批相关的业务,比如请假、报销、采购等业务。 为什么要使用工作流呢? 对于复杂的业务流程,通过数据库的状态字段难以控制和…

软考信管高级——质量管理

质量管理内容 质量保证QA(过程符合要求/过程改进) (1)按项目计划开展质量活动,使项目过程和产品符合质量要求,即按计划做质量; (2)提高项目干系人对项目将要满足质量要求的信心; (3)按过程改进计划进行过程改进&…

金兰组织 | 2023金兰解决方案集经营管理篇正式发布

为助力企业创新管理、提质增效,人大金仓携手金兰组织成员单位,于近期发布多项经营管理领域的联合解决方案,共享创新应用成果。 /人大金仓高级副总裁宋瑞/ 人大金仓高级副总裁宋瑞在致辞中表示:“联合解决方案创新是指通过把不同领…

利用谷歌云Pub/Sub 实现多任务并行分发处理方案

背景 目前老梁团队负责的Global Data Integration Platform每天有大量文件需要从来自不同地区的上游下载文件并进行处理后再发送到不同下游。老梁的数据集成平台集群有6个服务器节点,老梁希望所有机器的资源都能利用上,提升大量文件并行处理能力&#x…

C# Microsoft.ClearScript.V8脚本使用

1、ClearScript支持的功能和适用场景 微软的.net是非常强大和灵活的,除了C#体系脚本扩展,也支持其他流行的脚本扩展,Microsoft.ClearScript.V8就是一个.NET绑定到Google V8的脚本引擎。它允许.NET应用程序直接从JavaScript代码中调用函数&am…

Redis布隆过滤器的原理和应用场景,解决缓存穿透

目录 专栏导读一、布隆过滤器BloomFilter是什么二、布隆过滤器BloomFilter能干嘛?三、布隆过滤器使用场景1、解决缓存穿透问题2、黑名单3、网页爬虫对URL的去重,避免爬取相同的URL地址四、操作布隆过滤器BloomFilter1、使用布隆过滤器2、删除key3、判断是否存在五、代码实例1…

黑客开始使用双 DLL 侧载来逃避检测

一个名为“Dragon Breath”、“Golden Eye Dog”或“APT-Q-27”的 APT 黑客组织正在展示一种新趋势,即使用经典 DLL 旁加载技术的多种复杂变体来逃避检测。 这些攻击变体从一个初始向量开始,该向量利用一个干净的应用程序,最常见的是 Telegr…

vue_组件基础

单文件组件 Vue 单文件组件&#xff08;又名 *.vue 文件&#xff0c;缩写为 SFC&#xff09;是一种特殊的文件格式&#xff0c;它允许将 Vue 组件的模板、逻辑 与 样式封装在单个文件中 <template><h3>单文件组件</h3> </template><script> ex…

asp.net+c#操作系统课程在线教学平台

1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对登录进来的用户判断身份信息&#xff0c;判断是管理员用户还是普通用户。 2&#xff0e;系统用户管理&#xff1a;不管是…

答疑解惑:开发者必须彻底搞懂的 SSL/TLS 协议

简介 本期答疑解惑将和大家一起认识SSL/TLS 协议。请尝试回答以下几个问题&#xff1a; 使用浏览器访问https网站和http网站有什么不同&#xff1f;SSL协议作用于网络模型的哪一层&#xff1f;你知道CSDN&#xff0c;博客园正在使用的是什么类型的SSL证书吗&#xff1f;SSL&a…

汇编实现LED循环点亮(延时子程序模板)

在单片机P2口外接8个发光二极管(低电平驱动)。试编写一个汇编程序&#xff0c;实现LED循环点亮功能:P2.0-P2.1-P2.2-P2.3-…-P2.7-P2.6-P25-…-P2.0的顺序&#xff0c;无限循环。要求采用软件延时方式控制闪烁时间间隔(约50ms)。 首先进行电路设计 电路原理图设计 利用 Prot…

php+vue影视电影视频点播推荐avxhe系统

影视推荐系统的主要使用者分为管理员和用户&#xff0c;实现功能包括管理员&#xff1a;首页、个人中心、用户管理、公告信息管理、电影分类管理、影视推荐管理、付费点播管理、点播信息管理、管理员管理、系统管理&#xff0c;用户&#xff1a;首页、个人中心、付费点播管理、…

数字化转型导师坚鹏:企业数字化领导力提升之道

企业数字化领导力提升之道 ——融合中西智慧&#xff0c;践行知行合一思想&#xff0c;实现知行果合一 课程背景&#xff1a; 很多企业存在以下问题&#xff1a; 不知道如何领导面临的数字化时代&#xff1f; 不清楚企业数字化领导力模型的内涵&#xff1f; 不知道如何…