加密與安全_探索簽名算法

文章目錄

  • 概述
  • 應用
  • 常用數字簽名算法
  • Code
  • DSA簽名
  • ECDSA簽名
  • 小結

在這里插入圖片描述


概述

在非對稱加密中,使用私鑰加密、公鑰解密確實是可行的,而且有著特定的應用場景,即數字簽名。

數字簽名的主要目的是確保消息的完整性、真實性和不可否認性。通過使用私鑰加密消息,發送者相當于對消息進行了簽名,因為只有發送者擁有私鑰,所以只有發送者能夠生成正確的簽名。然后,其他人可以使用發送者的公鑰來驗證簽名,確保消息確實是由發送者簽署的。

這種方式確保了消息的真實性和不可否認性,因為只有私鑰的持有者才能夠生成正確的簽名,其他人無法偽造。同時,公鑰的持有者可以通過驗證簽名來確認消息的完整性和真實性。

因此,私鑰加密產生的密文通常被用作數字簽名,而公鑰則用于驗證簽名的有效性。這種方法在保護通信內容的完整性和發送方身份方面發揮著重要作用,是數字證書和加密通信中常用的技術手段之一。

私鑰加密得到的密文實際上就是數字簽名,要驗證這個簽名是否正確,只能用私鑰持有者的公鑰進行解密驗證。使用數字簽名的目的是為了確認某個信息確實是由某個發送方發送的,任何人都不可能偽造消息,并且,發送方也不能抵賴


應用

實際應用中,對消息的簽名不直接針對原始消息,而是對消息的哈希值進行簽名,以提高效率和安全性。這樣做的好處是,哈希值通常較短且固定長度,而且哈希值的簽名不會受到消息長度的影響,同時仍然能夠確保消息的完整性和真實性。

signature = encrypt(privateKey, sha256(message))

簽名驗證過程也是類似的,對簽名進行解密得到簽名的哈希值,然后與原始消息的哈希值進行比較,以確認簽名的有效性和消息的完整性。

hash = decrypt(publicKey, signature)

私鑰用于簽名,相當于用戶的身份標識,只有持有私鑰的用戶才能夠生成正確的簽名。公鑰用于驗證簽名,通過驗證簽名的有效性,可以確認消息確實是由具有對應私鑰的用戶簽名的。這種方式確保了消息的真實性、完整性和發送方的身份認證,是數字簽名在安全通信中的重要應用之一。


常用數字簽名算法

  1. RSA with SHA-256(SHA256withRSA):結合了RSA非對稱加密算法和SHA-256哈希算法。SHA-256產生的哈希值長度為256位,提供了較高的安全性。

  2. RSA with SHA-1(SHA1withRSA):同樣結合了RSA非對稱加密算法和SHA-1哈希算法。然而,由于SHA-1存在碰撞攻擊的漏洞,因此不推薦在新的應用中使用。

  3. RSA with MD5(MD5withRSA):結合了RSA非對稱加密算法和MD5哈希算法。然而,MD5也存在碰撞攻擊的漏洞,因此也不推薦在安全性要求較高的應用中使用。

  4. ECDSA with SHA-256:基于橢圓曲線數字簽名算法(ECDSA)和SHA-256哈希算法,提供了與RSA相當的安全性,但在相同安全級別下使用更短的密鑰。

  5. ECDSA with SHA-1:同樣基于ECDSA和SHA-1哈希算法。然而,由于SHA-1的安全性問題,不推薦在新的應用中使用。

  6. DSA with SHA-1:基于數字簽名算法(DSA)和SHA-1哈希算法。與ECDSA相比,DSA在相同安全級別下需要更長的密鑰長度。

在實際應用中,推薦使用RSA with SHA-256ECDSA with SHA-256等結合了安全性和效率的數字簽名算法。同時,為了確保安全性,應選擇安全性較高的哈希算法,并定期更新密鑰以及使用更長的密鑰長度。


Code

以下是帶有中文注釋的代碼:

package com.artisan.securityalgjava.sig;import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.*;public class SignatureTest {public static void main(String[] args) throws Exception {// 生成RSA公鑰/私鑰:KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA");kpGen.initialize(1024);KeyPair kp = kpGen.generateKeyPair();PrivateKey sk = kp.getPrivate(); // 獲取私鑰PublicKey pk = kp.getPublic(); // 獲取公鑰// 待簽名的消息:byte[] message = "Hello, I am Artisan!".getBytes(StandardCharsets.UTF_8);// 用私鑰簽名:Signature s = Signature.getInstance("SHA1WithRSA"); // 獲取SHA1WithRSA簽名算法的實例s.initSign(sk); // 初始化Signature對象,指定使用私鑰進行簽名s.update(message); // 更新要簽名的消息byte[] signed = s.sign(); // 對消息進行簽名System.out.println(String.format("signature: %x", new BigInteger(1, signed))); // 打印簽名結果// 用公鑰驗證:Signature v = Signature.getInstance("SHA1withRSA"); // 獲取SHA1withRSA簽名算法的實例v.initVerify(pk); // 初始化Signature對象,指定使用公鑰進行驗證v.update(message); // 更新要驗證的消息boolean valid = v.verify(signed); // 驗證簽名System.out.println("valid? " + valid); // 打印驗證結果}
}

使用了Java的Signature類來進行數字簽名和驗證。它生成了RSA公鑰和私鑰,并使用私鑰對消息進行簽名,然后使用公鑰驗證簽名的有效性。簽名算法選擇了SHA1WithRSA


DSA簽名

DSA(Digital Signature Algorithm)是一種與RSA不同的數字簽名算法,它使用了ElGamal數字簽名算法的變種。DSA的設計目的是為了提供與RSA相當的安全性,同時在簽名和驗證速度上更快。

DSA常與SHA(Secure Hash Algorithm)哈希算法結合使用,常用的DSA算法有:

  1. SHA1withDSA:使用SHA-1哈希算法和DSA進行數字簽名。

  2. SHA256withDSA:使用SHA-256哈希算法和DSA進行數字簽名。

  3. SHA512withDSA:使用SHA-512哈希算法和DSA進行數字簽名。

這些算法與RSA相比,具有更快的簽名速度。因此,在對性能要求較高的場景中,可以考慮使用DSA算法進行數字簽名。

但由于SHA-1存在安全性問題,因此不推薦使用SHA1withDSA。在現代應用中,推薦使用更安全的哈希算法,例如SHA-256或SHA-512結合DSA進行數字簽名。


ECDSA簽名

ECDSA(Elliptic Curve Digital Signature Algorithm)是一種基于橢圓曲線的數字簽名算法,它與DSA類似,但使用了橢圓曲線來提供相同或更高的安全性。

ECDSA的特點包括:

  1. 基于橢圓曲線:與RSA和DSA相比,ECDSA使用橢圓曲線算法來實現數字簽名,這使得它能夠在保持相同安全級別的情況下使用更短的密鑰長度。

  2. 私鑰推出公鑰:與RSA不同,ECDSA的私鑰可以推導出對應的公鑰,這使得密鑰管理更加靈活。

  3. 高效性能:ECDSA在簽名和驗證過程中具有較高的性能表現,尤其適用于資源受限的環境。

在加密貨幣領域,比特幣等加密貨幣通常使用ECDSA算法進行數字簽名。比特幣采用的橢圓曲線標準是secp256k1,這是一種特定的橢圓曲線參數集。

BouncyCastle庫提供了ECDSA的完整實現,可以用于生成密鑰對、簽名和驗證操作。利用BouncyCastle,開發者可以輕松地在Java應用程序中使用ECDSA算法進行數字簽名。


小結

數字簽名是一種基于非對稱加密算法的技術,用于確保數據的完整性、真實性和不可否認性。發送方使用私鑰對原始數據進行簽名,而接收方使用發送方的公鑰來驗證簽名的有效性。

數字簽名的主要作用包括:

  1. 防止偽造:由于只有發送方擁有私鑰,因此只有發送方能夠生成正確的簽名。這樣,接收方可以通過驗證簽名來確認數據的來源,從而防止偽造。

  2. 防止抵賴:由于數字簽名是由發送方的私鑰生成的,因此發送方不能夠抵賴曾經生成過的簽名。接收方可以利用簽名來證明數據確實是由發送方發送的,從而防止發送方否認其責任。

  3. 檢測篡改:數字簽名還可以用于檢測數據的篡改。如果數據在傳輸過程中發生了篡改,那么其簽名也會失效,因為簽名是基于原始數據生成的。接收方可以通過驗證簽名來確定數據是否經過了篡改。

常用的數字簽名算法包括MD5withRSA、SHA1withRSA、SHA256withRSA、SHA1withDSA、SHA256withDSA、SHA512withDSA、ECDSA等。這些算法結合了哈希算法(如MD5、SHA-1、SHA-256等)和非對稱加密算法(如RSA、DSA、ECDSA等),用于生成和驗證數字簽名,以實現數據的安全傳輸和驗證。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715264.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715264.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715264.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

云服務器購買教程

在購買云服務器之前,建議仔細評估自身需求和預算,并與多個云服務提供商進行比較,以確保選擇到最適合的解決方案。購買云服務器的具體步驟可能因所選云服務提供商而異。以下以實際操作的方式介紹如何購買一款云服務器。 云服務器購買常見問題…

【數倉】zookeeper軟件安裝及集群配置

相關文章 【數倉】基本概念、知識普及、核心技術【數倉】數據分層概念以及相關邏輯【數倉】Hadoop軟件安裝及使用(集群配置)【數倉】Hadoop集群配置常用參數說明 一、環境準備 準備3臺虛擬機 Hadoop131:192.168.56.131Hadoop132&#xff…

【Spring連載】使用Spring Data訪問 MongoDB----對象映射之基于類型的轉換器

【Spring連載】使用Spring Data訪問 MongoDB----對象映射之基于類型的轉換器 一、自定義轉換二、轉換器消歧(Disambiguation)三、基于類型的轉換器3.1 寫轉換3.2 讀轉換3.3 注冊轉換器 一、自定義轉換 下面的Spring Converter實現示例將String對象轉換為自定義Email值對象: R…

藍橋杯_定時器的綜合應用實例

一 工程 代碼 在單片機訓練平臺上,利用定時器T0,數碼管模塊和2個獨立按鍵(J5的2,3短接),設計一個秒表,具有清零,暫停,啟動功能。 顯示模式:分-秒-0.05秒&…

Linux進程——信號詳解(上)

文章目錄 信號入門生活角度的信號技術應用角度的信號用kill -l命令可以察看系統定義的信號列表信號處理常見方式概述 產生信號通過鍵盤進行信號的產生,ctrlc向前臺發送2號信號通過系統調用異常軟件條件 信號入門 生活角度的信號 你在網上買了很多件商品&#xff0…

前端面試練習24.3.2-3.3

HTMLCSS部分 一.說一說HTML的語義化 在我看來,它的語義化其實是為了便于機器來看的,當然,程序員在使用語義化標簽時也可以使得代碼更加易讀,對于用戶來說,這樣有利于構建良好的網頁結構,可以在優化用戶體…

vue3項目中如何一個vue組件中的一個div里面的圖片鋪滿整個屏幕樣式如何設置

在Vue 3項目中,要使一個div內的圖片鋪滿整個屏幕,你需要確保幾個關鍵點:div元素和圖片元素的樣式設置正確,以及確保它們能夠覆蓋整個視口(viewport)。以下是一個簡單的步驟和代碼示例,幫助你實現…

代碼隨想錄算法訓練營第四八天 | 買股票

目錄 只買賣一次可買賣多次 LeetCode 121. 買賣股票的最佳時機 LeetCode 122. 買賣股票的最佳時機II 只買賣一次 給定一個數組 prices ,它的第 i 個元素 prices[i] 表示一支給定股票第 i 天的價格。 你只能選擇 某一天 買入這只股票,并選擇在 未來的某…

瀏覽器輸入URL到頁面渲染經歷了哪些過程?

瀏覽器輸入URL到頁面渲染的過程可以分為以下幾個步驟: 解析URL:當用戶在瀏覽器的地址欄輸入URL后,瀏覽器會首先解析這個URL,判斷其是否合法。查找緩存:瀏覽器會查看自己的緩存,判斷是否有之前訪問過的這個U…

論文閱讀--Diffusion Models for Reinforcement Learning: A Survey

一、論文概述 本文主要內容是關于在強化學習中應用擴散模型的綜述。文章首先介紹了強化學習面臨的挑戰,以及擴散模型如何解決這些挑戰。接著介紹了擴散模型的基礎知識和在強化學習中的應用方法。然后討論了擴散模型在強化學習中的不同角色,并對其在多個…

【JavaSE】實用類——String、日期等

目錄 String類常用方法String類的equals()方法String中equals()源碼展示 “”和equals()有什么區別呢? StringBuffer類常用構造方法常用方法代碼示例 面試題:String類、StringBuffer類和StringBuilder類的區別?日期類Date類Calendar類代碼示例…

leetcode169. 多數元素的四種解法

leetcode169. 多數元素 題目描述 給定一個大小為 n 的數組 nums ,返回其中的多數元素。多數元素是指在數組中出現次數 大于? n/2 ? 的元素。 你可以假設數組是非空的,并且給定的數組總是存在多數元素。 1.哈希 class Solution { public:int majority…

【vue3】命令式組件封裝,message封裝示例;(函數式組件?)

僅做代碼示例;當然改進的地方還是不少的,僅作為該類組件封裝方式的初步啟發; 理想大成肯定是想要像 餓了么 這些組件庫一樣。 有的人叫這函數式組件,有的人叫這命令式組件,我個人還是偏向于命令式組件的稱呼。因為以vu…

Django配置靜態文件

Django配置靜態文件 目錄 Django配置靜態文件靜態文件配置調用方法 一般我們將html文件都放在默認templates目錄下 靜態文件放在static目錄下 static目錄大致分為 js文件夾css文件夾img文件夾plugins文件夾 在瀏覽器輸入url能夠看到對應的靜態資源,如果看不到說明…

向爬蟲而生---Redis 探究篇4<Redis主從復制(2)>

前言: 繼續上一篇向爬蟲而生---Redis 探究篇4<Redis主從復制(1)>-CSDN博客 正文: 讀寫操作和一致性保證 主節點和從節點對讀寫操作的不同處理方式 在Redis主從復制中,主節點和從節點對讀寫操作有不同的處理方式: 主節點&…

vim文本編輯器 的命令及快捷鍵

vim文本編輯器常用的命令及快捷鍵 vim文本編輯器功能命令 命令功能i從光標當前位置進入插入模式a從光標下一位進入插入模式ESC鍵退出編輯模式dd刪除2dd刪除兩行u撤銷上一步操作wq保存并退出0光標移動至文本開頭G光標移至文本末尾$光標移動至行尾^光標移動至行首q或q!退出不保…

支持向量機算法(帶你了解原理 實踐)

引言 在機器學習和數據科學中,分類問題是一種常見的任務。支持向量機(Support Vector Machine, SVM)是一種廣泛使用的分類算法,因其出色的性能和高效的計算效率而受到廣泛關注。本文將深入探討支持向量機算法的原理、特點、應用&…

13. Springboot集成Protobuf

目錄 1、前言 2、Protobuf簡介 2.1、核心思想 2.2、Protobuf是如何工作的? 2.3、如何使用 Protoc 生成代碼? 3、Springboot集成 3.1、引入依賴 3.2、定義Proto文件 3.3、Protobuf生成Java代碼 3.4、配置Protobuf的序列化和反序列化 3.5、定義…

【中英對照】【自譯】【精華】麻省理工學院MIT技術雙月刊(Bimonthly MIT Technology Review)2024年3/4月刊內容概覽

一、說明 Notation 僅供學習、參考,請勿用于商業行為。 二、本期封面、封底 Covers 本期雜志購于新加坡樟宜機場Changi Airport Singapore,售價為20.50新元。 本期仍然關注倫敦的AI大會。(筆者十分想去,在倫敦和MIT校園均設有會…

IDEA的安裝教程

1、下載軟件安裝包 官網下載:https://www.jetbrains.com/idea/ 2、開始安裝IDEA軟件 解壓安裝包,找到對應的idea可執行文件,右鍵選擇以管理員身份運行,執行安裝操作 3、運行之后,點擊NEXT,進入下一步 4、…