校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Java加密和數字簽名編程

Java加密和數字簽名編程

熱門標簽:黃石智能營銷電銷機器人效果 怎樣把地圖標注出來 地圖標注人員兼職 騰訊地圖標注商戶改名注冊入駐 淮南騰訊地圖標注 漯河辦理400電話 開封便宜外呼系統報價 電話機器人的特色和創新 商丘百應電話機器人有沒有效果

  本文主要談一下密碼學中的加密和數字簽名,以及其在java中如何進行使用。對密碼學有興趣的伙伴,推薦看Bruce Schneier的著作:Applied Crypotography。在jdk1.5的發行版本中安全性方面有了很大的改進,也提供了對RSA算法的直接支持,現在我們從實例入手解決問題(本文僅是作為簡單介紹):

  一、密碼學上常用的概念 

  1)消息摘要:

  這是一種與消息認證碼結合使用以確保消息完整性的技術。主要使用單向散列函數算法,可用于檢驗消息的完整性,和通過散列密碼直接以文本形式保存等,目前廣泛使用的算法有MD4、MD5、SHA-1,jdk1.5對上面都提供了支持,在java中進行消息摘要很簡單, java.security.MessageDigest提供了一個簡易的操作方法:

  /**
  *MessageDigestExample.java
  *Copyright 2005-2-16
  */
  import java.security.MessageDigest;
  /**
  *單一的消息摘要算法,不使用密碼.可以用來對明文消息(如:密碼)隱藏保存
  */
  public class MessageDigestExample{
  public static void main(String[] args) throws Exception{
  if(args.length!=1){
   System.err.println("Usage:java MessageDigestExample text");
   System.exit(1);
  }

  byte[] plainText=args[0].getBytes("UTF8");

  //使用getInstance("算法")來獲得消息摘要,這里使用SHA-1的160位算法
  MessageDigest messageDigest=MessageDigest.getInstance("SHA-1");

  System.out.println(" "+messageDigest.getProvider().getInfo());
  //開始使用算法
  messageDigest.update(plainText);
  System.out.println(" Digest:");
  //輸出算法運算結果
  System.out.println(new String(messageDigest.digest(),"UTF8"));
  }
  }

  還可以通過消息認證碼來進行加密實現,javax.crypto.Mac提供了一個解決方案,有興趣者可以參考相關API文檔,本文只是簡單介紹什么是摘要算法。

  2)私鑰加密:

  消息摘要只能檢查消息的完整性,但是單向的,對明文消息并不能加密,要加密明文的消息的話,就要使用其他的算法,要確保機密性,我們需要使用私鑰密碼術來交換私有消息。

  這種最好理解,使用對稱算法。比如:A用一個密鑰對一個文件加密,而B讀取這個文件的話,則需要和A一樣的密鑰,雙方共享一個私鑰(而在web環境下,私鑰在傳遞時容易被偵聽):

  使用私鑰加密的話,首先需要一個密鑰,可用javax.crypto.KeyGenerator產生一個密鑰(java.security.Key),然后傳遞給一個加密工具(javax.crypto.Cipher),該工具再使用相應的算法來進行加密,主要對稱算法有:DES(實際密鑰只用到56位),AES(支持三種密鑰長度:128、192、256位),通常首先128位,其他的還有DESede等,jdk1.5種也提供了對對稱算法的支持,以下例子使用AES算法來加密:

  /**
  *PrivateExmaple.java
  *Copyright 2005-2-16
  */
  import javax.crypto.Cipher;
  import javax.crypto.KeyGenerator;
  import java.security.Key;

  /**
  *私鈅加密,保證消息機密性
  */
  public class PrivateExample{
  public static void main(String[] args) throws Exception{
  if(args.length!=1){
   System.err.println("Usage:java PrivateExample ");
   System.exit(1);
  }
  byte[] plainText=args[0].getBytes("UTF8");

  //通過KeyGenerator形成一個key
  System.out.println(" Start generate AES key");
  KeyGenerator keyGen=KeyGenerator.getInstance("AES");
  keyGen.init(128);
  Key key=keyGen.generateKey();
  System.out.println("Finish generating DES key");

  //獲得一個私鈅加密類Cipher,ECB是加密方式,PKCS5Padding是填充方法
  Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding");
  System.out.println(" "+cipher.getProvider().getInfo());

  //使用私鈅加密
  System.out.println(" Start encryption:");
  cipher.init(Cipher.ENCRYPT_MODE,key);
  byte[] cipherText=cipher.doFinal(plainText);
  System.out.println("Finish encryption:");
  System.out.println(new String(cipherText,"UTF8"));

  System.out.println(" Start decryption:");
  cipher.init(Cipher.DECRYPT_MODE,key);
  byte[] newPlainText=cipher.doFinal(cipherText);
  System.out.println("Finish decryption:");

  System.out.println(new String(newPlainText,"UTF8"));

  }
  }

  3)公鑰加密:

  上面提到,私鑰加密需要一個共享的密鑰,那么如何傳遞密鑰呢?web環境下,直接傳遞的話很容易被偵聽到,幸好有了公鑰加密的出現。公鑰加密也叫不對稱加密,不對稱算法使用一對密鑰對,一個公鑰,一個私鑰,使用公鑰加密的數據,只有私鑰能解開(可用于加密);同時,使用私鑰加密的數據,只有公鑰能解開(簽名)。但是速度很慢(比私鑰加密慢100到1000倍),公鑰的主要算法有RSA,還包括Blowfish,Diffie-Helman等,jdk1.5種提供了對RSA的支持,是一個改進的地方:

  /**
  *PublicExample.java
  *Copyright 2005-2-16
  */
  import java.security.Key;
  import javax.crypto.Cipher;
  import java.security.KeyPairGenerator;
  import java.security.KeyPair;
  /**
  *一個簡單的公鈅加密例子,Cipher類使用KeyPairGenerator生成的公鈅和私鈅
  */
  public class PublicExample{
  public static void main(String[] args) throws Exception{
  if(args.length!=1){
   System.err.println("Usage:java PublicExample ");
   System.exit(1);
  }

  byte[] plainText=args[0].getBytes("UTF8");
  //構成一個RSA密鑰
  System.out.println(" Start generating RSA key");
  KeyPairGenerator keyGen=KeyPairGenerator.getInstance("RSA");
  keyGen.initialize(1024);
  KeyPair key=keyGen.generateKeyPair();
  System.out.println("Finish generating RSA key");

  //獲得一個RSA的Cipher類,使用公鈅加密
  Cipher cipher=Cipher.getInstance("RSA/ECB/PKCS1Padding");
  System.out.println(" "+cipher.getProvider().getInfo());

  System.out.println(" Start encryption");
  cipher.init(Cipher.ENCRYPT_MODE,key.getPublic());
  byte[] cipherText=cipher.doFinal(plainText);
  System.out.println("Finish encryption:");
  System.out.println(new String(cipherText,"UTF8"));

  //使用私鈅解密
  System.out.println(" Start decryption");
  cipher.init(Cipher.DECRYPT_MODE,key.getPrivate());
  byte[] newPlainText=cipher.doFinal(cipherText);
  System.out.println("Finish decryption:");
  System.out.println(new String(newPlainText,"UTF8"));
  }
  }

  4)數字簽名:

  數字簽名,它是確定交換消息的通信方身份的第一個級別。上面A通過使用公鑰加密數據后發給B,B利用私鑰解密就得到了需要的數據,問題來了,由于都是使用公鑰加密,那么如何檢驗是A發過來的消息呢?上面也提到了一點,私鑰是唯一的,那么A就可以利用A自己的私鑰進行加密,然后B再利用A的公鑰來解密,就可以了;數字簽名的原理就基于此,而通常為了證明發送數據的真實性,通過利用消息摘要獲得簡短的消息內容,然后再利用私鑰進行加密散列數據和消息一起發送。java中為數字簽名提供了良好的支持,java.security.Signature類提供了消息簽名:

  /**
  *DigitalSignature2Example.java
  *Copyright 2005-2-16
  */
  import java.security.Signature;
  import java.security.KeyPairGenerator;
  import java.security.KeyPair;
  import java.security.SignatureException;

  /**
  *數字簽名,使用RSA私鑰對對消息摘要簽名,然后使用公鈅驗證 測試
  */
  public class DigitalSignature2Example{
  public static void main(String[] args) throws Exception{
  if(args.length!=1){
   System.err.println("Usage:java DigitalSignature2Example ");
   System.exit(1);
  }

  byte[] plainText=args[0].getBytes("UTF8");
  //形成RSA公鑰對
  System.out.println(" Start generating RSA key");
  KeyPairGenerator keyGen=KeyPairGenerator.getInstance("RSA");
  keyGen.initialize(1024);

  KeyPair key=keyGen.generateKeyPair();
  System.out.println("Finish generating RSA key");
  //使用私鈅簽名
  Signature sig=Signature.getInstance("SHA1WithRSA");
  sig.initSign(key.getPrivate());
  sig.update(plainText);
  byte[] signature=sig.sign();
  System.out.println(sig.getProvider().getInfo());
  System.out.println(" Signature:");
  System.out.println(new String(signature,"UTF8"));

  //使用公鈅驗證
  System.out.println(" Start signature verification");
  sig.initVerify(key.getPublic());
  sig.update(plainText);
  try{
   if(sig.verify(signature)){
    System.out.println("Signature verified");
   }else System.out.println("Signature failed");
   }catch(SignatureException e){
    System.out.println("Signature failed");
   }
  }
  }


  5)數字證書。

  還有個問題,就是公鑰問題,A用私鑰加密了,那么B接受到消息后,用A提供的公鑰解密;那么現在有個討厭的C,他把消息攔截了,然后用自己的私鑰加密,同時把自己的公鑰發給B,并告訴B,那是A的公鑰,結果....,這時候就需要一個中間機構出來說話了(相信權威,我是正確的),就出現了Certificate Authority(也即CA),有名的CA機構有Verisign等,目前數字認證的工業標準是:CCITT的X.509:
  數字證書:它將一個身份標識連同公鑰一起進行封裝,并由稱為認證中心或 CA 的第三方進行數字簽名。

  密鑰庫:java平臺為你提供了密鑰庫,用作密鑰和證書的資源庫。從物理上講,密鑰庫是缺省名稱為 .keystore 的文件(有一個選項使它成為加密文件)。密鑰和證書可以擁有名稱(稱為別名),每個別名都由唯一的密碼保護。密鑰庫本身也受密碼保護;您可以選擇讓每個別名密碼與主密鑰庫密碼匹配。

  使用工具keytool,我們來做一件自我認證的事情吧(相信我的認證):

  1、創建密鑰庫keytool -genkey -v -alias feiUserKey -keyalg RSA 默認在自己的home目錄下(windows系統是c:documents and settings你的用戶名> 目錄下的.keystore文件),創建我們用 RSA 算法生成別名為 feiUserKey 的自簽名的證書,如果使用了-keystore mm 就在當前目錄下創建一個密鑰庫mm文件來保存密鑰和證書。

  2、查看證書:keytool -list 列舉了密鑰庫的所有的證書

  也可以在dos下輸入keytool -help查看幫助。

   4)數字簽名:

  數字簽名,它是確定交換消息的通信方身份的第一個級別。上面A通過使用公鑰加密數據后發給B,B利用私鑰解密就得到了需要的數據,問題來了,由于都是使用公鑰加密,那么如何檢驗是A發過來的消息呢?上面也提到了一點,私鑰是唯一的,那么A就可以利用A自己的私鑰進行加密,然后B再利用A的公鑰來解密,就可以了;數字簽名的原理就基于此,而通常為了證明發送數據的真實性,通過利用消息摘要獲得簡短的消息內容,然后再利用私鑰進行加密散列數據和消息一起發送。java中為數字簽名提供了良好的支持,java.security.Signature類提供了消息簽名:

  /**
  *DigitalSignature2Example.java
  *Copyright 2005-2-16
  */
  import java.security.Signature;
  import java.security.KeyPairGenerator;
  import java.security.KeyPair;
  import java.security.SignatureException;

  /**
  *數字簽名,使用RSA私鑰對對消息摘要簽名,然后使用公鈅驗證 測試
  */
  public class DigitalSignature2Example{
  public static void main(String[] args) throws Exception{
  if(args.length!=1){
   System.err.println("Usage:java DigitalSignature2Example ");
   System.exit(1);
  }

  byte[] plainText=args[0].getBytes("UTF8");
  //形成RSA公鑰對
  System.out.println(" Start generating RSA key");
  KeyPairGenerator keyGen=KeyPairGenerator.getInstance("RSA");
  keyGen.initialize(1024);

  KeyPair key=keyGen.generateKeyPair();
  System.out.println("Finish generating RSA key");
  //使用私鈅簽名
  Signature sig=Signature.getInstance("SHA1WithRSA");
  sig.initSign(key.getPrivate());
  sig.update(plainText);
  byte[] signature=sig.sign();
  System.out.println(sig.getProvider().getInfo());
  System.out.println(" Signature:");
  System.out.println(new String(signature,"UTF8"));

  //使用公鈅驗證
  System.out.println(" Start signature verification");
  sig.initVerify(key.getPublic());
  sig.update(plainText);
  try{
   if(sig.verify(signature)){
    System.out.println("Signature verified");
   }else System.out.println("Signature failed");
   }catch(SignatureException e){
    System.out.println("Signature failed");
   }
  }
  }

  5)數字證書。

  還有個問題,就是公鑰問題,A用私鑰加密了,那么B接受到消息后,用A提供的公鑰解密;那么現在有個討厭的C,他把消息攔截了,然后用自己的私鑰加密,同時把自己的公鑰發給B,并告訴B,那是A的公鑰,結果....,這時候就需要一個中間機構出來說話了(相信權威,我是正確的),就出現了Certificate Authority(也即CA),有名的CA機構有Verisign等,目前數字認證的工業標準是:CCITT的X.509:
  數字證書:它將一個身份標識連同公鑰一起進行封裝,并由稱為認證中心或 CA 的第三方進行數字簽名。

  密鑰庫:java平臺為你提供了密鑰庫,用作密鑰和證書的資源庫。從物理上講,密鑰庫是缺省名稱為 .keystore 的文件(有一個選項使它成為加密文件)。密鑰和證書可以擁有名稱(稱為別名),每個別名都由唯一的密碼保護。密鑰庫本身也受密碼保護;您可以選擇讓每個別名密碼與主密鑰庫密碼匹配。

  使用工具keytool,我們來做一件自我認證的事情吧(相信我的認證):

  1、創建密鑰庫keytool -genkey -v -alias feiUserKey -keyalg RSA 默認在自己的home目錄下(windows系統是c:documents and settings你的用戶名> 目錄下的.keystore文件),創建我們用 RSA 算法生成別名為 feiUserKey 的自簽名的證書,如果使用了-keystore mm 就在當前目錄下創建一個密鑰庫mm文件來保存密鑰和證書。

  2、查看證書:keytool -list 列舉了密鑰庫的所有的證書

  也可以在dos下輸入keytool -help查看幫助。

您可能感興趣的文章:
  • JAVA加密算法數字簽名實現原理詳解
  • Java PDF 添加數字簽名的實現方法
  • Java實現的數字簽名算法RSA完整示例
  • 詳解Java數字簽名提供XML安全
  • 淺析java消息摘要與數字簽名
  • Java數字簽名算法DSA實例詳解
  • Java加密解密和數字簽名完整代碼示例
  • 使用數字簽名實現數據庫記錄防篡改(Java實現)
  • 常用數字簽名算法RSA與DSA的Java程序內實現示例
  • Java2下Applet數字簽名
  • Java 添加數字簽名到excel及檢測,刪除簽名

標簽:大興安嶺 拉薩 岳陽 馬鞍山 亳州 武威 紅河 鄭州

巨人網絡通訊聲明:本文標題《Java加密和數字簽名編程》,本文關鍵詞  Java,加密,和,數字簽名,編程,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Java加密和數字簽名編程》相關的同類信息!
  • 本頁收集關于Java加密和數字簽名編程的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    91在线免费视频观看| 乱一区二区av| 一区二区三区在线高清| 日韩成人午夜电影| 天天射综合影视| 亚洲国产另类av| 99re这里只有精品首页| 精品少妇一区二区三区视频免付费 | 粉嫩av一区二区三区粉嫩| 国产ts人妖一区二区| 91农村精品一区二区在线| 在线电影一区二区三区| 国产欧美精品在线观看| 天堂一区二区在线免费观看| 国产精品一区三区| 色一情一乱一乱一91av| 国产精品欧美一级免费| 欧美a一区二区| 欧美在线制服丝袜| 国产精品久久久久9999吃药| 久久综合综合久久综合| 欧美日韩精品电影| 中文字幕不卡一区| 国产一二精品视频| 亚洲精品一区在线观看| 青青草91视频| 911精品国产一区二区在线| 亚洲精品成人少妇| 99久久久久久| 亚洲在线视频网站| 欧美日韩国产大片| 午夜av区久久| 精品国产三级电影在线观看| 国产成人一区在线| 国产免费观看久久| 亚洲国产wwwccc36天堂| 亚洲免费在线观看视频| 一区二区视频在线看| 一区二区三区免费观看| 国产盗摄精品一区二区三区在线 | 久久国产精品第一页| 91蝌蚪国产九色| 午夜欧美视频在线观看| 欧美日韩国产另类一区| 免费观看30秒视频久久| 精品福利一二区| 色综合天天综合给合国产| 一级精品视频在线观看宜春院| 欧美日韩国产天堂| 成人晚上爱看视频| 午夜欧美在线一二页| 国产精品你懂的在线欣赏| 欧美日韩一级二级三级| 成人午夜视频福利| 亚洲成人一区二区在线观看| 精品国产精品网麻豆系列| 99久久久久免费精品国产 | 麻豆精品一区二区三区| 久久精品国产在热久久| 亚洲国产aⅴ天堂久久| 亚洲精品中文在线观看| 亚洲天堂精品在线观看| 日韩一区在线播放| 日本一区二区久久| 国产精品二区一区二区aⅴ污介绍| 日韩精品自拍偷拍| 国产亚洲一本大道中文在线| 亚洲精品一区二区精华| 久久久不卡网国产精品一区| 国产欧美日韩三级| 亚洲三级久久久| 日本免费在线视频不卡一不卡二| 亚洲va欧美va国产va天堂影院| 天天色 色综合| 成人永久看片免费视频天堂| 日本黄色一区二区| 日韩欧美国产一区二区在线播放 | 中文字幕av资源一区| 亚洲精品伦理在线| 国产精品一级片在线观看| 欧美综合欧美视频| 欧美激情综合网| 国产揄拍国内精品对白| 免费在线观看日韩欧美| 91电影在线观看| 国产视频一区在线播放| 欧美国产一区二区在线观看| 久久男人中文字幕资源站| 欧美人伦禁忌dvd放荡欲情| 色天天综合色天天久久| 欧美一区二区在线不卡| jlzzjlzz亚洲日本少妇| 99天天综合性| 岛国av在线一区| 欧美日本精品一区二区三区| 欧美日韩国产三级| 欧美白人最猛性xxxxx69交| 91精品久久久久久久久99蜜臂 | 欧美天堂一区二区三区| 99v久久综合狠狠综合久久| 欧美日韩日日夜夜| 久久婷婷色综合| 亚洲丝袜自拍清纯另类| 视频一区免费在线观看| 国产成人av一区| 欧美高清视频www夜色资源网| 在线成人小视频| 亚洲情趣在线观看| 婷婷综合在线观看| 精品一区二区三区香蕉蜜桃| 色综合天天综合网天天狠天天| 欧美午夜电影网| 国产一区二区三区精品欧美日韩一区二区三区 | 国产精品美日韩| 久久成人av少妇免费| 日日夜夜精品视频免费| 午夜不卡av免费| 欧美精品三级日韩久久| 久久精品av麻豆的观看方式| 国产精品情趣视频| 制服.丝袜.亚洲.中文.综合| 成人sese在线| 九九视频精品免费| 亚洲自拍欧美精品| 欧美一卡二卡三卡| 91在线免费播放| 国产高清精品网站| 日韩一级免费一区| 狠狠久久亚洲欧美| 日韩免费观看高清完整版| 午夜国产不卡在线观看视频| 精品视频一区二区不卡| 日韩成人精品在线观看| 91麻豆精品国产91久久久| 亚洲欧美一区二区三区久本道91| 日本亚洲天堂网| av在线一区二区| 无码av免费一区二区三区试看| 欧美少妇性性性| 九九国产精品视频| 国产视频一区二区在线观看| 色又黄又爽网站www久久| 亚洲成av人综合在线观看| 欧美精品在线视频| 韩国一区二区三区| 亚洲欧美另类小说| 日韩美一区二区三区| 成人av资源在线观看| 亚洲444eee在线观看| 国产欧美一区在线| 欧美日韩在线亚洲一区蜜芽| 亚洲人午夜精品天堂一二香蕉| 国产成人午夜精品5599| 亚洲欧美另类综合偷拍| 国产亚洲综合在线| 日本一二三四高清不卡| 国产99久久久久久免费看农村| 国产成人精品午夜视频免费| 国产精品白丝jk黑袜喷水| 日韩一区欧美二区| 成人精品国产一区二区4080| 亚洲一区二区不卡免费| 欧美一区二区视频网站| 国模套图日韩精品一区二区| 亚洲大片精品永久免费| 国产精品国产精品国产专区不蜜| 美女网站色91| 国产精品你懂的| 99久久国产综合精品麻豆| 亚洲国产精品一区二区久久 | 欧美国产精品劲爆| 国产精品卡一卡二| 一区二区免费视频| 日一区二区三区| 国产乱色国产精品免费视频| 久久影院午夜论| 国产欧美一区二区精品久导航| 国产亚洲欧美激情| 中文字幕一区二区三中文字幕| 国产精品全国免费观看高清| 麻豆中文一区二区| 综合欧美一区二区三区| 一区二区三区欧美激情| 欧美aa在线视频| 91精品国产综合久久精品app| 国产精品久久久久久久久搜平片| 欧美夫妻性生活| 欧洲精品在线观看| av中文字幕不卡| 精品亚洲国产成人av制服丝袜| 亚洲不卡在线观看| 国产网站一区二区三区| 欧美成人三级电影在线| 国内精品在线播放| 婷婷成人激情在线网| 国产精品乱人伦中文| 久久天天做天天爱综合色| 欧美自拍偷拍一区| 91色乱码一区二区三区| 丁香六月久久综合狠狠色|