亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

java結合keytool如何實現非對稱簽名和驗證詳解

2024-07-14 08:41:58
字體:
來源:轉載
供稿:網友

前言

本文主要介紹了關于java結合keytool實現非對稱簽名和驗證的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧

keytool的使用

keytool是JDK自帶的一個密鑰庫管理工具。這里只用到了keytool的部分功能,包括生成密鑰對,導出公鑰等。keytool生成的公鑰/私鑰對存放到一個到了一個文件中,這個文件有密碼保護,通稱為keystore。

生成密鑰對

$ keytool -genkey -alias signLegal -keystore examplestanstore -validity 1800

生成別名為signLegal的密鑰對,存放在密鑰庫examplestanstore中,證書的有效期是1800天(默認是90天)。

輸入一系列的參數。輸入的參數遵循了LDAP的風格和標準??梢韵胂?,生成的密鑰對可以看成LDAP的一個條目。

命令執行成功后會在當前目錄下創建一個叫examplestanstore的文件。

查看密鑰對

$ keytool -list -keystore examplestanstore -v

列出了examplestanstore密鑰庫的中所有密鑰對。-v參數表示詳細信息,詳細信息中有證書的失效時間。

導出公鑰證書

$ keytool -export -keystore examplestanstore -alias signLegal -file StanSmith.cer

導出的公鑰存放在當前目錄的StanSmith.cer文件中,是個二進制文件。

java簽名和驗證

參考了java安全官方教程。 

在該官方教程中,GenSig.java類生成密鑰對,對輸入的文件進行簽名,輸出了一個簽名結果文件sig和公鑰suepk。

VerSig.java類接受三個參數:公鑰文件名(suepk)、簽名文件(sig)、被簽名的源文件名(hello.txt)。

該教程解釋了兩個類的原理,并附加有源碼。將源碼下載并編譯。創建一個hello.txt的文件作為被簽名的目標文件,里面隨便放點字符串。然后執行:

$ java GenSig hello.txt   (生成文件sig和suepk)$ java VerSig suepk sig hello.txtsignature verifies: true

在實際使用時,密鑰對不可能每次在程序中重新生成。而keytool恰好可以生成并相對安全保存密鑰對。所以下面結合了keytool和java實現的功能。

結合keytool與java簽名/驗證

參考

密鑰對由keytool生成并保存到keystore中保護起來(keystore有密碼)。公鑰也從keystore中導出。GenSig.java類只需要從keystore中取得私鑰進行簽名即可。

VerSig.java也要做適當的修改。貌似因為從keystore中導出的是證書而不是公鑰,兩者的封裝格式估計有差異。

具體步驟

  • 利用keytool -genkey生成密鑰對保存在keystore中(庫文件是examplestanstore)
  • 利用`keytool -export'從keystore中導出公鑰證書(StanSmith.cer)
  • 利用新類GenSig2.java生成簽名(文件名是sig),GenSig2.java會從keystore中取私鑰
  • 將公鑰(StanSmith.cer)、簽名(sig)、被簽名文件(hello.txt)發給驗證方
  • 驗證方利用VerSig2.java進行驗證

下面是GenSig2.java和VerSig2.java的源碼和執行方式。

GenSig2.java

import java.io.*;import java.security.*;class GenSig2 { public static void main(String[] args) { if (args.length != 1) {  System.out.println("Usage: java GenSig2 <nameOfFileToSign>");  } else try{  /*create key paire use keytool:  $ keytool -genkey -alias signLegal -keystore examplestanstore -validity 1800*/  // read keystore file  KeyStore ks = KeyStore.getInstance("JKS");  FileInputStream ksfis = new FileInputStream("examplestanstore");  BufferedInputStream ksbufin = new BufferedInputStream(ksfis);  // open keystore and get private key  // alias is 'signLeal', kpasswd/spasswd is 'vagrant'  ks.load(ksbufin, "vagrant".toCharArray());  PrivateKey priv = (PrivateKey) ks.getKey("signLegal", "vagrant".toCharArray());  /* Create a Signature object and initialize it with the private key */  Signature dsa = Signature.getInstance("SHA1withDSA", "SUN");  dsa.initSign(priv);  /* Update and sign the data */  FileInputStream fis = new FileInputStream(args[0]);  BufferedInputStream bufin = new BufferedInputStream(fis);  byte[] buffer = new byte[1024];  int len;  while (bufin.available() != 0) {  len = bufin.read(buffer);  dsa.update(buffer, 0, len);  };  bufin.close();  /* Now that all the data to be signed has been read in,   generate a signature for it */  byte[] realSig = dsa.sign();  /* Save the signature in a file */  FileOutputStream sigfos = new FileOutputStream("sig");  sigfos.write(realSig);  sigfos.close();  /* public key file can export from keystore use keytool:  $ keytool -export -keystore examplestanstore -alias signLegal -file StanSmith.cer */ } catch (Exception e) {  System.err.println("Caught exception " + e.toString()); } };

編譯后,這樣運行:

$ java GenSig2 hello.txt

會生成簽名文件sig。

VerSig2.java

import java.io.*;import java.security.*;import java.security.spec.*;class VerSig2 { public static void main(String[] args) { /* Verify a DSA signature */ if (args.length != 3) {  System.out.println("Usage: VerSig publickeyfile signaturefile datafile");  } else try{  /* import encoded public cert */  FileInputStream certfis = new FileInputStream(args[0]);  java.security.cert.CertificateFactory cf =  java.security.cert.CertificateFactory.getInstance("X.509");  java.security.cert.Certificate cert = cf.generateCertificate(certfis);  PublicKey pubKey = cert.getPublicKey();  /* input the signature bytes */  FileInputStream sigfis = new FileInputStream(args[1]);  byte[] sigToVerify = new byte[sigfis.available()];  sigfis.read(sigToVerify );  sigfis.close();  /* create a Signature object and initialize it with the public key */  Signature sig = Signature.getInstance("SHA1withDSA", "SUN");  sig.initVerify(pubKey);  /* Update and verify the data */  FileInputStream datafis = new FileInputStream(args[2]);  BufferedInputStream bufin = new BufferedInputStream(datafis);  byte[] buffer = new byte[1024];  int len;  while (bufin.available() != 0) {  len = bufin.read(buffer);  sig.update(buffer, 0, len);  };  bufin.close();  boolean verifies = sig.verify(sigToVerify);  System.out.println("signature verifies: " + verifies); } catch (Exception e) {  System.err.println("Caught exception " + e.toString()); }; }}

編譯后,這樣運行(StanSmith.cer是利用keytool導出的公鑰證書,見前文):

$ java VerSig2 StanSmith.cer sig hello.txtsignature verifies: true

openssl

雖然也研究了一下openssl,但發現與java難以結合,難度也很大。例如它的教程中采用的是RSA,而上面的java使用的是DSA。所以只是貼在這里備忘,可以忽略。

參考

生成私鑰

$ openssl genrsa -out key.pem 1024$ cat key.pem-----BEGIN RSA PRIVATE KEY-----MIICXQIBAAKBgQCzVDmu6Cf2QF7cERCGYU3B8Epm6pkkpMZFgotphXMgAmBBNJbhSi7qPH4R5JlEm1ZXPr5DZH/pyJBWQhiiHGeUAOve+GOgvt9Rk25r7OEWYvn/GCr/JBfLBGqwtlzn/t2s2x04IooshsGkOd6YpZoztkEDtu2gKHedFczF607IvwIDAQABAoGAMdbIqUmwQYomUvcTJqXIXIwRwYSVx09cI1lisZL7Kfw/ECAzhq19WHAzgXmM9zpMxraTXluCCVFKfA6mlfda+ZoBlKSYdOecwNB+TSAumf9XK8uHW/g8C+Ykq9OGg9Uiy8rKnl12Zaiu9H8L82ud0CkTFW2636/PuKgtp+4YbXECQQDhKdh8lwgumg7HYIw5476QOHnPL7c3OFPGtaOZMZJkjMPfRzgR4B5PjcGnOLDoTlkATcBPmXtLwwJJSzaBdaRjAkEAy+NwdOzC1yQrTrkZQx1brNjO3iytfkl3t1xAWyz5Sy1IB7+4fsodEh3br5E1o5YRipY2GJZvp2OAAt3tz6iS9QJASvIYwu+qo4hX3vk9847gwTRrJxFk1JaFHCEdgUJEzf8ku08DVL/alvRCPxzZlZluenFmz5fwuDkCq87DJ7g2rQJBAMDM+SnIPdMeA8n0pRvfJjLD7pMP4pu6M3fzx3Owiqj5T9TsCjXzQBxCmdxizzs7DKlltA/6Kek64PFVFa25tgUCQQCTM1VwfNKjFbd+0HuF6WAs3Odjuo0gKk/QIjdn7M5/I0kxEApKxTto3oiuCQGeYL/sqy3WjM0476w48+xUsQeF-----END RSA PRIVATE KEY-----

導出公鑰

$ openssl rsa -in key.pem -pubout -out pub-key.pem$ cat pub-key.pem-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCzVDmu6Cf2QF7cERCGYU3B8Epm6pkkpMZFgotphXMgAmBBNJbhSi7qPH4R5JlEm1ZXPr5DZH/pyJBWQhiiHGeUAOve+GOgvt9Rk25r7OEWYvn/GCr/JBfLBGqwtlzn/t2s2x04IooshsGkOd6YpZoztkEDtu2gKHedFczF607IvwIDAQAB-----END PUBLIC KEY-----

摘要計算

創建一個內容是1234的文本文件hello.txt。用openssl計算它的SHA256摘要(SHA256是jarsigner的默認摘要算法):

$ cat hello.txt1234$ openssl dgst -SHA256 -out hello.sha256 hello.txt$ cat hello.sha256SHA256(hello.txt)= a883dafc480d466ee04e0d6da986bd78eb1fdd2178d04693723da3a8f95d42f4

簽名和驗證

對摘要文件hello.sha256進行簽名:

$ openssl rsautl -sign -in hello.sha256 -out hello.sign -inkey key.pem

用公鑰對簽名進行驗證:

$ openssl rsautl -verify -in hello.sign -inkey pub-key.pem -pubinSHA256(hello.txt)= a883dafc480d466ee04e0d6da986bd78eb1fdd2178d04693723da3a8f95d42f4

用公鑰驗證必須加上-pubin參數。 用私鑰對簽名進行驗證:

$ openssl rsautl -verify -in hello.sign -inkey key.pemSHA256(hello.txt)= a883dafc480d466ee04e0d6da986bd78eb1fdd2178d04693723da3a8f95d42f4

驗證的STD輸出與摘要文件hello.sha256的內容一樣,說明驗證可以通過。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产综合久久久久久久久| 欧美激情第一页xxx| 欧美福利视频在线| 2018中文字幕一区二区三区| 中文字幕一区日韩电影| 日韩电影中文字幕在线| 国产精品男女猛烈高潮激情| 欧美成人午夜免费视在线看片| 精品国产欧美一区二区五十路| 伊人成人开心激情综合网| 在线观看精品自拍私拍| 不卡av日日日| 国内精品小视频| 国产精品九九九| 亚洲综合中文字幕在线观看| 久久久精品一区二区| 国产噜噜噜噜久久久久久久久| 国产成人精品在线播放| 中文字幕免费精品一区高清| 91精品啪在线观看麻豆免费| 国产精品免费久久久| 日韩精品一区二区视频| 最近2019年日本中文免费字幕| 久久久爽爽爽美女图片| 国产精品久久久久久久久久久久久久| 美女视频久久黄| 久久琪琪电影院| 亚洲一区999| 日韩电影大全免费观看2023年上| 国产精品成久久久久三级| 8x海外华人永久免费日韩内陆视频| 亚洲区bt下载| 精品国内产的精品视频在线观看| 欧美精品videosex极品1| 久久久久999| 亚洲精品www| 韩日精品中文字幕| 欧美激情性做爰免费视频| 日韩一区二区三区国产| 日韩高清a**址| 日韩国产一区三区| 欧美丰满少妇xxxxx做受| 欧美多人爱爱视频网站| 欧美精品在线极品| 欧美日韩免费一区| 一区二区av在线| 狠狠久久亚洲欧美专区| 免费91麻豆精品国产自产在线观看| 懂色av影视一区二区三区| 久久精品青青大伊人av| 欧美黄色免费网站| 青青草99啪国产免费| 欧美电影在线观看| 91美女片黄在线观| 欧美亚州一区二区三区| 久久久久久91香蕉国产| 亚洲品质视频自拍网| 国产精品视频99| 欧美有码在线视频| 成人免费在线视频网址| 欧美电影在线观看高清| www.国产一区| 久久久视频免费观看| 91免费的视频在线播放| 欧美老女人xx| 久久夜色精品国产亚洲aⅴ| 亚洲欧美日韩中文视频| 久久久久久久久久久免费精品| 在线日韩第一页| 国产午夜精品全部视频在线播放| 亚洲欧美日韩一区二区在线| 亚洲高清一区二| 国产精品一区专区欧美日韩| 欧美在线一级视频| 欧美制服第一页| 国产精品丝袜久久久久久高清| 热99精品里视频精品| 韩日精品中文字幕| 日韩免费精品视频| 97视频网站入口| 国产91精品最新在线播放| 国产精品91在线观看| 久久久久久久激情视频| 欧美一级淫片丝袜脚交| 在线视频国产日韩| 九九热这里只有在线精品视| 97精品免费视频| 久久久久日韩精品久久久男男| 国产精品直播网红| 欧美综合第一页| 欧美丝袜一区二区三区| 欧美高跟鞋交xxxxhd| 欧美激情视频一区二区三区不卡| 久久久免费观看视频| 亚洲国产一区二区三区四区| 国产精品国产三级国产aⅴ9色| 精品爽片免费看久久| 久操成人在线视频| 亚洲日本成人网| 91爱视频在线| 在线视频日韩精品| 色婷婷久久一区二区| 亚洲免费福利视频| 4438全国成人免费| 国产精品老女人视频| 国产美女精品视频| 亚洲一级片在线看| 欧美国产日韩免费| 国产综合在线观看视频| 国产成人欧美在线观看| 91av视频在线| 国产精品一区二区三区成人| 2019亚洲日韩新视频| 久久影院在线观看| 97精品视频在线| 日本久久久久久久| 日韩在线欧美在线国产在线| 欧美日韩aaaa| 国产日韩欧美另类| 国语自产精品视频在线看一大j8| 国语自产偷拍精品视频偷| 国产一区视频在线播放| 欧洲亚洲在线视频| xxxx欧美18另类的高清| 亚洲欧洲国产伦综合| 欧美成人在线免费| 久久久999国产精品| 亚洲影视中文字幕| 疯狂做受xxxx高潮欧美日本| 亚洲二区在线播放视频| 成人黄色午夜影院| 欧美激情一级精品国产| 亚洲欧美在线看| 欧美在线观看一区二区三区| 亚洲高清不卡av| 国产欧美日韩精品丝袜高跟鞋| 欧美精品日韩www.p站| 欧美剧在线观看| 国产成人综合久久| 欧美性猛交xxxx乱大交3| 欧美国产一区二区三区| 亚洲黄色片网站| 精品国产一区二区三区久久| 精品国产一区二区在线| 成人情趣片在线观看免费| 日韩精品高清在线观看| 久久精品亚洲国产| 国产精品爽黄69| 欧美噜噜久久久xxx| 亚洲欧美激情视频| 日本精品中文字幕| 欧美日韩中文字幕| 国产欧美亚洲视频| 成人在线观看视频网站| 日av在线播放中文不卡| 欧美怡红院视频一区二区三区| 亚洲系列中文字幕| 国产精品一区二区三区久久久| 久久伊人精品视频| 亚洲精品日韩激情在线电影| 91日韩在线播放| 精品国产拍在线观看| 亚洲第一页中文字幕| 日韩视频在线一区|