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

首頁 > 編程 > JSP > 正文

Java加密和數字簽名編程

2024-09-05 00:21:36
字體:
來源:轉載
供稿:網友

  本文主要談一下密碼學中的加密和數字簽名,以及其在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查看幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国内高清视频| 色悠悠久久久久| 亚洲аv电影天堂网| 97视频在线观看网址| 91精品免费久久久久久久久| 国产精品久久网| 成人网在线免费观看| 欧美一级淫片videoshd| 亚洲欧美三级伦理| 91chinesevideo永久地址| 九九精品在线视频| 久久人人爽亚洲精品天堂| 成人国产在线视频| 97视频免费在线看| 久久精品亚洲一区| 欧美巨乳在线观看| 欧美视频在线观看 亚洲欧| 91在线免费看网站| 亚洲精品动漫久久久久| 欧美精品午夜视频| 欧美日韩精品国产| 亚洲精品一区在线观看香蕉| 国产中文欧美精品| 久久久精品一区二区| 国产成人综合精品在线| 久久精品电影网站| 久久精品成人欧美大片| 亚洲精品网站在线播放gif| 欧美激情视频在线| 欧美大片网站在线观看| 国产精品久久久久久久app| 中日韩美女免费视频网址在线观看| 久久免费视频观看| 亚洲专区在线视频| 日韩av日韩在线观看| 日韩中文字幕在线| 久久久久久久久国产精品| 日韩亚洲国产中文字幕| 伊人一区二区三区久久精品| 欧美成人精品三级在线观看| 欧美性猛交xxxx富婆弯腰| 琪琪第一精品导航| 九色精品美女在线| 亚洲综合大片69999| 欧美有码在线观看| 97免费视频在线播放| 国产成人精品免费久久久久| 日韩在线免费视频观看| 日韩免费观看在线观看| 久久久精品久久| 欧美一二三视频| 日韩av在线看| 国产精品日日做人人爱| 亚洲精品720p| 成人黄色网免费| 欧美日韩美女视频| 日韩中文字幕在线视频播放| 亚洲国产精品成人av| 日韩精品视频在线免费观看| 欧美精品久久久久久久免费观看| 久久精品成人欧美大片古装| 亚洲国产精品成人精品| 欧美精品videossex性护士| 亚洲视频在线看| 欧美高清视频免费观看| 久久久久久久久久久av| 欧美性理论片在线观看片免费| 激情懂色av一区av二区av| 亚洲色图欧美制服丝袜另类第一页| 97视频在线看| 97视频在线观看免费| 久久久久久久国产| 性欧美在线看片a免费观看| 日韩激情视频在线| 国产欧美一区二区三区四区| 欧美孕妇孕交黑巨大网站| 日韩大片在线观看视频| 黑人与娇小精品av专区| 国产精品久久久久久久久影视| 亚洲第一级黄色片| 国产精品入口夜色视频大尺度| 亚洲欧美三级伦理| 91免费看片在线| 亚洲精品动漫100p| 欧美自拍视频在线| 97国产精品视频人人做人人爱| 久久久精品欧美| 日韩精品小视频| 九九精品视频在线| 中文字幕在线日韩| 国产精品福利小视频| 日韩精品高清在线| 亚洲二区在线播放视频| 亚洲福利视频在线| 国产美女久久久| 亚洲欧洲黄色网| 岛国av一区二区在线在线观看| 欧美成人高清视频| yw.139尤物在线精品视频| 欧美日韩在线视频一区二区| 亚洲精品白浆高清久久久久久| 色婷婷综合久久久久| 国产精品日韩一区| 26uuu亚洲伊人春色| 日韩美女视频免费在线观看| 国产精品免费一区二区三区都可以| 最近2019年日本中文免费字幕| 亚洲国产天堂久久综合网| 成人写真视频福利网| 亚洲第一精品久久忘忧草社区| 日韩h在线观看| 国产精品久久久久999| 亚洲国产女人aaa毛片在线| 日韩电影在线观看永久视频免费网站| 少妇高潮久久久久久潘金莲| 亚洲视频一区二区三区| 亚洲高清一二三区| 国产日韩在线亚洲字幕中文| 懂色aⅴ精品一区二区三区蜜月| 日本欧美在线视频| 国产精品久久久久av| 欧美黄色性视频| 亚洲成人a**站| 欧美乱人伦中文字幕在线| 日本高清不卡的在线| 欧美极度另类性三渗透| 亚洲精品ady| 成人黄色免费看| 久久网福利资源网站| 在线观看国产欧美| 亚洲人午夜精品| 91精品在线观看视频| 操日韩av在线电影| 日韩精品极品毛片系列视频| 中文字幕在线看视频国产欧美在线看完整| 亚洲3p在线观看| 久久久精品在线| 国产成人精品在线播放| 国产精品欧美日韩| 亚洲视频在线视频| 亚洲欧美三级伦理| 亚洲香蕉在线观看| 国语自产偷拍精品视频偷| 久久免费成人精品视频| 精品久久久999| 国产一区二区在线免费| 欧美在线观看日本一区| 欧美电影免费播放| 亚洲午夜激情免费视频| 久久久www成人免费精品| 欧美亚洲视频在线看网址| 久久久久久亚洲| 日本精品性网站在线观看| 国产精品视频播放| 日韩最新在线视频| 中文字幕少妇一区二区三区| 国产97色在线|日韩| 国产91在线播放精品91| 国产精品27p| 福利一区视频在线观看| 色综合伊人色综合网站| 91av网站在线播放| 国产精品视频久久久久| 亚洲在线第一页|