JAVA數(shù)字簽名.doc_第1頁
JAVA數(shù)字簽名.doc_第2頁
JAVA數(shù)字簽名.doc_第3頁
JAVA數(shù)字簽名.doc_第4頁
JAVA數(shù)字簽名.doc_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

一、網(wǎng)絡(luò)數(shù)據(jù)安全包括數(shù)據(jù)的本身的安全性、數(shù)據(jù)的完整性(防止篡改)、數(shù)據(jù)來源的不可否認(rèn)性等要素。對數(shù)據(jù)采用加密算法加密可以保證數(shù)據(jù)本身的安全性,利用消息摘要可以保證數(shù)據(jù)的完整性,但是還有一點就是數(shù)據(jù)來源的不可否認(rèn)性(也就是數(shù)據(jù)來自哪里接收者是清楚的,而且發(fā)送數(shù)據(jù)者不可抵賴)。有些方案曾經(jīng)使用消息認(rèn)證碼(MAC)來保證數(shù)據(jù)來源于合法的發(fā)送著,但是利用消息認(rèn)證碼會帶來一個問題,就是通訊雙方必須事先約定兩者之間的通訊用共享密碼。在我們的互聯(lián)網(wǎng)如此龐大的今天,這顯然是不合適的,而數(shù)字簽名可以解決我們的這個問題。數(shù)字簽名(通常的數(shù)字簽名)的基礎(chǔ)是公鑰密碼體系(例如:RSA)。發(fā)送者有獨一無二的公鑰和私鑰,公鑰是公開的,私鑰秘密保留。發(fā)送者利用私鑰對數(shù)據(jù)的消息摘要進(jìn)行數(shù)字簽名,接收者利用發(fā)送者的公鑰來驗證數(shù)字簽名,其實就是把加密過程顛倒過來使用。由于發(fā)送者的私鑰是獨一無二的,而且是秘密的,因此當(dāng)能夠驗證解開數(shù)字簽名的數(shù)字摘要是正確的后,那么我們就可以肯定發(fā)送者的身份了,這就是數(shù)字簽名的基本原理。 為什么要用消息摘要呢?原因是這樣的,由于公鑰加密算法加解密的速度較慢,對整個數(shù)據(jù)進(jìn)行加密肯定是行不通的,而消息摘要有個好處就是短而且長度固定,就象數(shù)據(jù)的指紋一樣,所以對摘要進(jìn)行簽名。 二、數(shù)字簽字的原理: 在數(shù)字簽名應(yīng)用中,首先由發(fā)送者身份生成它的私鑰和公鑰,然后由發(fā)送者通過私鑰把數(shù)據(jù)加密后,并將加密后的數(shù)據(jù)發(fā)送給接收者;接收者把發(fā)送者加密過的數(shù)據(jù)通過發(fā)送者的共鑰進(jìn)行簽名驗證。三、例子說明: 現(xiàn)在我們就轉(zhuǎn)入正題了。JAVA的數(shù)字簽名類封裝在Signature類(java.security.Signature)中。接下來,編寫三個功能(即三個Java類): a、生成一對密鑰,即私鑰和公鑰,對于密鑰的保存可以使用對象流的方式進(jìn)行保存和傳送, 也可以使用編碼的方式保存;在這里基于方便,我是使用編碼方式進(jìn)行保存的;類名是:GenerateKeyPair.javab、編寫發(fā)送者的功能:首先通過私鑰加密待輸出數(shù)據(jù)Data,并輸出Data和簽名后的Data; 類名是:SignatureData.javac、編寫接收者的功能:使用發(fā)送者的公鑰來驗證發(fā)送過來的加密Data,判斷簽名的合法性;類名是:VerifySignature.java 四、生成一對密鑰,即私鑰和公鑰,對于密鑰的保存可以使用對象流的方式進(jìn)行保存和傳送,也可以使用編碼的方式保存;在這里基于方便,我是使用編碼方式進(jìn)行保存的;類名是:GenerateKeyPair.java:import java.security.KeyPair;import java.security.PrivateKey;import java.security.PublicKey;import java.security.SecureRandom;public class GenerateKeyPair private String priKey;private String pubKey;public void run() try java.security.KeyPairGenerator keygen = java.security.KeyPairGenerator.getInstance(RSA);SecureRandom secrand = new SecureRandom();secrand.setSeed(21cn.getBytes(); / 初始化隨機(jī)產(chǎn)生器keygen.initialize(1024, secrand);KeyPair keys = keygen.genKeyPair();PublicKey pubkey = keys.getPublic();PrivateKey prikey = keys.getPrivate();pubKey = bytesToHexStr(pubkey.getEncoded(); priKey = bytesToHexStr(prikey.getEncoded();System.out.println(pubKey= + pubKey);System.out.println(priKey= + priKey);System.out.println(寫入對象 pubkeys ok);System.out.println(生成密鑰對成功); catch (java.lang.Exception e) e.printStackTrace();System.out.println(生成密鑰對失敗);/* Transform the specified byte into a Hex String form.*/public static final String bytesToHexStr(byte bcd) StringBuffer s = new StringBuffer(bcd.length * 2);for (int i = 0; i 4) & 0x0f);s.append(bcdLookupbcdi & 0x0f);return s.toString();/* Transform the specified Hex String into a byte array.*/public static final byte hexStrToBytes(String s) byte bytes;bytes = new bytes.length() / 2;for (int i = 0; i bytes.length; i+) bytesi = (byte) Integer.parseInt(s.substring(2 * i, 2 * i + 2),16);return bytes;private static final char bcdLookup = 0, 1, 2, 3, 4, 5,6, 7, 8, 9, a, b, c, d, e, f ;/* param args*/public static void main(String args) / TODO Auto-generated method stubGenerateKeyPair n = new GenerateKeyPair();n.run();五、編寫發(fā)送者的功能:首先通過私鑰加密待輸出數(shù)據(jù)Data,并輸出Data和簽名后的Data;類名是:SignatureData.javaimport java.security.KeyFactory;import java.security.PrivateKey;import java.security.spec.PKCS8EncodedKeySpec;public class SignatureData public void run() try String prikeyvalue = 30820277020100300d;/這是GenerateKeyPair輸出的私鑰編碼PKCS8EncodedKeySpec priPKCS8=new PKCS8EncodedKeySpec(hexStrToBytes(prikeyvalue); KeyFactory keyf=KeyFactory.getInstance(RSA);PrivateKey myprikey=keyf.generatePrivate(priPKCS8);String myinfo = orderId=10dkfadsfksdkssdkd&amount=80&orderTime=20060509; / 要簽名的信息/ 用私鑰對信息生成數(shù)字簽名java.security.Signature signet = java.security.Signature.getInstance(MD5withRSA);signet.initSign(myprikey);signet.update(myinfo.getBytes(ISO-8859-1);byte signed = signet.sign(); / 對信息的數(shù)字簽名System.out.println(signed(簽名內(nèi)容)原值= + bytesToHexStr(signed);System.out.println(info(原值)= + myinfo);System.out.println(簽名并生成文件成功); catch (java.lang.Exception e) e.printStackTrace();System.out.println(簽名并生成文件失敗);/* Transform the specified byte into a Hex String form.*/public static final String bytesToHexStr(byte bcd) StringBuffer s = new StringBuffer(bcd.length * 2);for (int i = 0; i 4) & 0x0f);s.append(bcdLookupbcdi & 0x0f);return s.toString();/* Transform the specified Hex String into a byte array.*/public static final byte hexStrToBytes(String s) byte bytes;bytes = new bytes.length() / 2;for (int i = 0; i bytes.length; i+) bytesi = (byte) Integer.parseInt(s.substring(2 * i, 2 * i + 2),16);return bytes;private static final char bcdLookup = 0, 1, 2, 3, 4, 5,6, 7, 8, 9, a, b, c, d, e, f ;/* param args*/public static void main(String args) / TODO Auto-generated method stubSignatureData s = new SignatureData();s.run();六、編寫接收者的功能:使用發(fā)送者的公鑰來驗證發(fā)送過來的加密Data,判斷簽名的合法性;類名是:VerifySignature.java package com._21cn.cryptto; import java.security.KeyFactory;import java.security.PublicKey;import java.security.spec.X509EncodedKeySpec;public class VerifySignature public void run1() try String pubkeyvalue = 30819f300d06092a864886f70d01010105;X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(hexStrToBytes(pubkeyvalue);KeyFactory keyFactory = KeyFactory.getInstance(RSA);PublicKey pubKey = keyFactory.generatePublic(bobPubKeySpec);String info = orderId=10dkfadsfksdkssdkd&amount=80&orderTime=20060519;byte signed = hexStrToBytes(2292e02ba6bf6f1b1688a6fa2); java.security.Signature signetcheck=java.security.Signature.getInstance(MD5withRSA);signetcheck.initVerify(pubKey);signetcheck.update(info.getBytes();if (signetcheck.verify(signed) System.out.println(info= + info);System.out.println(簽名正常);else System.out.println(非簽名正常);catch (java.lang.Exception e) e.printStackTrace(); 其他:數(shù)字簽名和數(shù)字加密的工作流程與比較數(shù)字簽名是使用了公鑰加密技術(shù)并用于鑒別數(shù)字信息的方法。簡單地說,數(shù)字簽名是附加在數(shù)據(jù)單元上的一些數(shù)據(jù),或是對數(shù)據(jù)單元所作的密碼變換。這種數(shù)據(jù)或變換允許數(shù)據(jù)單元的接收者用以確認(rèn)數(shù)據(jù)單元的來源和數(shù)據(jù)單元的完整性并保護(hù)數(shù)據(jù),防止被他人進(jìn)行偽造。它是對電子形式的消息進(jìn)行簽名的一種方法,一個簽名消息能在一個通信網(wǎng)絡(luò)中傳輸。數(shù)字簽名主要經(jīng)過以下幾個過程:1、信息發(fā)送者使用一單向散列函數(shù)(HASH 函數(shù))對信息生成信息摘要;2、信息發(fā)送者使用自己的私鑰簽名信息摘要;3、信息發(fā)送者把信息本身和已簽名的信息摘要一起發(fā)送出去;4、信息接收者通過使用與信息發(fā)送者使用的同一個單向散列函數(shù)(HASH 函數(shù))對接收的信息本身生成新的信息摘要,再使用信息發(fā)送者的公鑰對信息摘要進(jìn)行驗證,以確認(rèn)信息發(fā)送者的身份和信息是否被修改過。數(shù)字加密是利用數(shù)學(xué)算法將明文轉(zhuǎn)變?yōu)椴豢赡芾斫獾拿芪幕蚍催^來將密文轉(zhuǎn)變?yōu)榭衫斫庑问降拿魑牡姆椒?、手段和理論的一門科學(xué)。利用數(shù)字加密可以將敏感信息加

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論