1. 程式人生 > >openssl 摘要和簽名驗證指令dgst使用詳解

openssl 摘要和簽名驗證指令dgst使用詳解

1、資訊摘要和數字簽名概述

資訊摘要:對資料進行處理,得到一段固定長度的結果,其特點輸入:

1,輸出長度固定。即輸出長度和輸入長度無關。

2,不可逆。即由輸出資料理論上不能推匯出輸入資料

如圖4所示,對輸入資料敏感。當輸入資料變化極小時,輸出資料也會發生明顯的變化

5,防碰撞。即不同的資料資料得到相同輸出資料的可能性極低。

由於資訊摘要有上述特點,一般保證資料的完整性,對一個大檔案進行摘要運算,得到其摘要值。通過網路或者其他渠道傳輸後,通過驗證其摘要值,確定大檔案本身有沒有發生變化。

數字簽名:數字簽名其實分成兩步,首先對原始檔案進行摘要運算,得到摘要值,然後使用公開金鑰演算法中的私鑰對摘要值進行加密其簽名和驗證過程如下圖所示

有數字簽名的過程可以知道,對傳送資訊進行數字簽名,可以保證數字簽名的完整性,真實性,不可抵賴性。即接收者可以確認訊息的來源,訊息的真實,傳送者不可以抵賴自己傳送的訊息,與現實生活中籤名的作用大致相同。

2,摘要演算法和數字簽名相關指令及用法

目前openssl提供的摘要演算法有md4,md5,ripemd160,sha,sha1,sha224,sha256,sha512,sha384,wirlpool。可以通過openssl dgst - 命令檢視。

上面我們已經提到了,數字簽名分為摘要和加密兩部分。在openssl提供的指令中,並沒有區分兩者。而是在摘要演算法指令中包含了簽名和校驗引數。例如我們適用openssl md5 - 命令可以看到它提供的選項有簽名和驗證等引數。

在OpenSSL的中單獨使用摘要演算法指令完成摘要或者簽名操作,也可以通過DGST完成相同的操作。在簽名的時候多數使用RSA私鑰或者DSA私鑰,當使用RSA私鑰的時候,我們可以使用單獨的摘要演算法指令指定摘要演算法進行簽名,但當使用DSA使用簽名的時候,就必須使用DGST指令,因為使用DSA簽名的時候必須使用DSA自身的摘要演算法,而OpenSSL的沒有為它提供相應的指令。

/*有明文檔案file.txt和RSA金鑰RSA.pem*/
[email protected]:~/test$ ls
file.txt  RSA.pem
/*使用md5指令指定sha1演算法,對file.txt進行簽名,生成簽名檔案sign1.txt*/
[email protected]
:~/test$ openssl md5 -sha1 -sign RSA.pem -out sign1.txt file.txt /*使用md5指令指定sha1演算法,對file.txt進行簽名,生成簽名檔案sign1.txt*/ [email protected]:~/test$ openssl dgst -sha1 -sign RSA.pem -out sign2.txt file.txt /*兩個簽名檔案一樣,說明兩個指令完成相同的功能*/ [email protected]:~/test$ diff sign1.txt sign2.txt

可以看到MD5和DGST完成相同的功能。不過讓人糾結的是使用MD5進行簽名的時候可以指定其他摘要演算法,筆者覺得太彆扭了。所以建議做摘要和簽名驗證時使用DGST指令,忘記其他... ...

DGST指令用法介紹如下

[email protected]:~/test$ openssl dgst -
unknown option '-'
options are
-c              to output the digest with separating colons        //輸出的摘要資訊以分號隔離,和-hex同時使用
-r              to output the digest in coreutils format           //指定輸出的格式
-d              to output debug info                               //輸出BIO除錯資訊
-hex            output as hex dump                                 //以16進位制列印輸出結果
-binary         output in binary form                              //輸出二進位制結果
-hmac arg       set the HMAC key to arg                            //指定hmac的key
-non-fips-allow allow use of non FIPS digest                       //允許使用不符合fips標準的摘要演算法
-sign   file    sign digest using private key in file              //執行簽名操作,後面指定私鑰檔案
-verify file    verify a signature using public key in file        //執行驗證操作,後面指定公鑰檔案,與prverfify不能同時使用
-prverify file  verify a signature using private key in file       //執行驗證操作,後面指定金鑰檔案,與verfify不能同時使用
-keyform arg    key file format (PEM or ENGINE)                    //指定金鑰檔案格式,pem或者engine
-out filename   output to filename rather than stdout              //指定輸出檔案,預設標準輸出
-signature file signature to verify                                //指定簽名檔案,在驗證簽名時使用
-sigopt nm:v    signature parameter                                //簽名引數
-hmac key       create hashed MAC with key                         //製作一個hmac 使用key
-mac algorithm  create MAC (not neccessarily HMAC)                 //製作一個mac
-macopt nm:v    MAC algorithm parameters or key                    //mac演算法引數或者key
-engine e       use engine e, possibly a hardware device.          //使用硬體或者三方加密庫
-md4            to use the md4 message digest algorithm            //摘要演算法使用md4
-md5            to use the md5 message digest algorithm            //摘要演算法使用md5
-ripemd160      to use the ripemd160 message digest algorithm      //摘要演算法使用ripemd160
-sha            to use the sha message digest algorithm            //摘要演算法使用sha
-sha1           to use the sha1 message digest algorithm           //摘要演算法使用sha1
-sha224         to use the sha224 message digest algorithm         //摘要演算法使用sha223
-sha256         to use the sha256 message digest algorithm         //摘要演算法使用sha256
-sha384         to use the sha384 message digest algorithm         //摘要演算法使用sha384
-sha512         to use the sha512 message digest algorithm         //摘要演算法使用sha512
-whirlpool      to use the whirlpool message digest algorithm      //摘要演算法使用whirlpool

3,DGST使用示例

如圖1所示,僅做摘要運算而不做簽名操作

/*對file.txt檔案使用sha1演算法進行hash運算*/
[email protected]:~/test$ openssl dgst -sha1 file.txt 
SHA1(file.txt)= c994aec2a9007221a9b9113b8ab60a60144740c9
/*指定–non-fips-allow引數,與fips標準有關,尚待研究*/
[email protected]:~/test$ openssl dgst –sha1 –non-fips-allow file.txt 
SHA1(file.txt)= c994aec2a9007221a9b9113b8ab60a60144740c9 
/*指定-d引數,列印除錯訊息*/
[email protected]:~/test$ openssl dgst -sha1 -d file.txt 
BIO[02469910]:ctrl(6) - FILE pointer
BIO[02469910]:ctrl return 0
BIO[02469910]:ctrl(108) - FILE pointer
BIO[02469910]:ctrl return 1
BIO[02469910]:read(0,8192) - FILE pointer
BIO[02469910]:read return 37
BIO[02469910]:read(0,8192) - FILE pointer
BIO[02469910]:read return 0
SHA1(file.txt)= c994aec2a9007221a9b9113b8ab60a60144740c9
BIO[02469910]:ctrl(1) - FILE pointer
BIO[02469910]:ctrl return 0
BIO[02469910]:Free - FILE pointer
/*指定-c -hex引數,以16進位制列印結果*/
[email protected]:~/test$ openssl dgst -sha1 -c -hex file.txt 
SHA1(file.txt)= c9:94:ae:c2:a9:00:72:21:a9:b9:11:3b:8a:b6:0a:60:14:47:40:c9
/*指定-r引數,輸出結果如下所示,然並卵……*/
[email protected]:~/test$ openssl dgst -sha1 -r file.txt 
c994aec2a9007221a9b9113b8ab60a60144740c9 *file.txt
/*指定-binary引數,輸入結果為二進位制*/
[email protected]:~/test$ openssl dgst -sha1 -binary file.txt 
ɔ�©r!��;��
`[email protected]@cmos:~/test$

2,使用RSA金鑰進行簽名驗證操作

/*摘要演算法選取sha256,金鑰RSA金鑰,對file.txt進行簽名*/
[email protected]:~/test$ openssl dgst -sign RSA.pem -sha256 -out sign.txt file.txt
/*使用RSA金鑰驗證簽名(prverify引數),驗證成功*/ 
[email protected]:~/test$ openssl dgst -prverify RSA.pem -sha256 -signature sign.txt file.txt 
Verified OKt 
/*從金鑰中提取公鑰*/
[email protected]:~/test$ openssl rsa -in RSA.pem -out pub.pem -pubout
writing RSA key
/*使用RSA公鑰驗證簽名(verify引數),驗證成功*/
[email protected]:~/test$ openssl dgst -verify pub.pem -sha256 -signature sign.txt file.txt 
Verified OK

3,使用DSA金鑰進行簽名驗證操作

/*使用DSA演算法,摘要演算法sha256,對file.txt進行簽名*/
[email protected]:~/test$ openssl dgst -sign DSA.pem -sha256 -out sign.txt file.txt 
/*使用DSA金鑰驗證簽名*/
[email protected]:~/test$ openssl dgst -prverify DSA.pem -sha256 -signature sign.txt file.txt
Verified OK
/*使用DSA演算法,摘要演算法dss1,對file.txt進行簽名*/
[email protected]:~/test$ openssl dgst -sign DSA.pem -dss1 -out sign1.txt file.txt 
/*使用DSA金鑰驗證簽名*/
[email protected]:~/test$ openssl dgst -prverify DSA.pem -dss1 -signature sign1.txt file.txt
Verified OK
/*提取公鑰*/
[email protected]:~/test$ openssl dsa -in DSA.pem -out pub.pem -pubout
read DSA key
writing DSA key
/*使用DSA公鑰驗證簽名*/
[email protected]:~/test$ openssl dgst -verify pub.pem -dss1 -signature sign1.txt file.txt 
Verified OK
/*使用DSA公鑰驗證簽名*/
[email protected]:~/test$ openssl dgst -verify pub.pem -sha256 -signature sign.txt file.txt 
Verified OK
[email protected]:~/test$

根據dgst man手冊的定義,如果使用DSA演算法進行簽名驗證,必須使用dss1摘要演算法,但是本實驗證明使用其他摘要演算法也可以簽名驗證。此處不明白,希望大牛指點......

相關推薦

openssl 摘要簽名驗證指令dgst使用

1、資訊摘要和數字簽名概述 資訊摘要:對資料進行處理,得到一段固定長度的結果,其特點輸入: 1,輸出長度固定。即輸出長度和輸入長度無關。 2,不可逆。即由輸出資料理論上不能推匯出輸入資料 如圖4所示,對輸入資料敏感。當輸入資料變化極小時,輸出資料也會發生明顯的變化

Linux系統下檔案賦權指令chmod檔案所有權指令chown

檔案賦權指令chmod( chmod -R 777 /home/user) 檢視檔案許可權的語句:   在終端輸入: ls -l xxx.xxx (xxx.xxx是檔名)   那麼就會出現相類

openssl在java端的加解密簽名驗證

一、前言 二、openssl下載 三、openssl使用 綠色版bin目錄下openssl.exe開啟執行,有個warning,可以不用理會。 下面命令不需要開啟頭的“openssl” 生成私鑰:openssl genrsa -out r

使用OpenSSL做RSA簽名驗證 支付寶移動快捷支付 的server異步通知

.com cond 排序 一個 string url base64編碼 sig const 因為業務須要。我們須要使用支付寶移動快捷支付做收款。支付寶給了我們《移動快捷支付應用集成接入包支付接口》見支付寶包《WS_SECURE_PAY_SDK》。 支付寶給的server

php使用openssl進行數字簽名驗證

簽名 contents create 個數字 字符 一個 logs php ont 1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: hanks 5 * Date: 6/2/2017 6 * Tim

基於密鑰庫數字證書的加密解密簽名驗證操作

return 產生 初始 www. 數字證書 ray get put 庫文件 package com.szzs; import java.io.FileInputStream; import java.security.KeyStore; import java.sec

nodejs中微信公眾號開發-介面配置簽名驗證

意外金喜的部落格 : http://blog.csdn.net/zzwwjjdj1 -- 建立專案 nodejs微信開發,本文介紹的是在express中使用 express命令列建立專案 :點選這裡, 建立專案 : weixin_ex

RSA加密解密簽名驗證機制以及其區別聯絡

https://blog.csdn.net/wangjianno2/article/details/68965299   1.RSA的加密解密機制原理RSA公鑰加密體制包含如下3個演算法:KeyGen(金鑰生成演算法),Encrypt(加密演算法)以及Decrypt(解密演算法)。詳細如下:

Fabric ENCChaincode 賬本資料AES256加密解密簽名驗證

目錄 六、總結 一、加密方式 AES256分組對稱加密是指將明文資料分解為多個16位元組的明文塊,利用金鑰分別對每個明文塊進行加密,得到相同個數的16位元組密文塊,如下圖所示: 如果分解後有明文塊不足16位元組,就需

lvskeeplived的工作原理

lvs+keeplived的工作原理一、lvs的工作原理 使用集群的技術和liunx的操作系統實現一個高性能、高可用的服務器。可伸縮性、可靠性、很好的管理性。 特點:可伸縮網絡服務的幾種結構,它們都需要一個前端的負載調度器(或者多個進行主從備份)。我們先分析實現虛擬網絡服務的主要技術,指出IP負載均衡技術

js ES6 SetMap數據結構

... 文章 正常 col rfi 關註 ash comm 遍歷 這篇文章主要介紹了ES6學習筆記之Set和Map數據結構,結合實例形式詳細分析了ECMAScript中基本數據結構Set和Map的常用屬性與方法的功能、用法及相關註意事項,需要的朋友可以參考下

NFSmount常用參數 本文目錄

2-0 元數據 處理 del 自己的 通過 opp lena 返回頁面頂部 NFS和mount常用參數詳解 本文目錄 NFS權限參數配置 mount掛載參數 原始驅動程序的掛載選項。 新驅動程序的掛載選項。 怎樣改變已經掛載的NTFS卷的權限? 怎樣自動掛載一個

windows命令行中javajavac、javap使用(java編譯命令)

路徑 point 目錄 pan static article 字節碼 區別 string 如題,首先我們在桌面,開始->運行->鍵入cmd 回車,進入windows命令行。進入如圖所示的畫面: 可知,當前默認目錄為C盤Users文件夾下的Administr

微信支付寶支付模式及實現二

配置 其余 logs https 朋友 一個 target 多租戶 對比   繼上篇《微信和支付寶支付模式詳解及實現》到現在已經有半年時間了,這期間不少朋友在公號留言支付相關的問題,最近正好也在處理公司支付相關的對接,打算寫這篇來做一個更進一步的介紹,同時根據主要的幾個支付

2.堆.棧內存映射

例子 color 註意 圖片 過程 size ont 大量 span 1.每個線程都有自己專屬的棧(stack),先進後出(LIFO) 2.棧的最大尺寸固定,超出則引起棧溢出 3.變量離開作用範圍後,棧上的數據會自動釋放 4.堆上內存必須手動釋放(C/C++)除非語言執行環

算法的時間復雜度空間復雜度

時間復雜度 沒有 實例 可能 以及 基本操作 語句 存儲空間 們的 算法的時間復雜度和空間復雜度合稱為算法的復雜度。 1.時間復雜度 (1)時間頻度 一個算法執行所耗費的時間,從理論上是不能算出來的,必須上機運行測試才能知道。但我們不可能也沒有必要對每個算法都上機測試,

route指令使用

linux 運維 route觀察路由表信息:route [-nee]觀察用的參數:-n :不要使用通訊協定或主機名稱,直接使用 IP 或 port number;-ee :使用更詳細的資訊來顯示輸出詳解route命令輸出的路由表字段含義如下:Destination 目標網絡或目標主機(本機的數

Nginx中常用的指令配置

Nginx中的rewrite指令的應用rewrite指令的作用:是做一些訪問匹配規則的判斷,從而實現相應的操作。location / {proxy_pass http://192.168.1.5if (-d $request_filename) {...........; 這裏的意思是訪問的如果是一個目錄

網絡互聯技術(四)-LSA的第四第五種類型

實驗 如何 分享 bsp ip地址 系統 計算 互聯 reference LSA的第四和第五種類型詳解 一、External LSA:第五種LSA   我們前面已經詳細介紹了前面三種LSA,今天就接著介紹第四種和第五種LSA。因為理解ASBR Summary LSA——

/etc/passwd/etc/group文件

color 超級用戶 sbin list UC mon usb use 表示 用戶管理 想要知道, 系統中有哪些用戶, 可以查看這個文件: /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sb