Java安全之數位簽章

來源:互聯網
上載者:User

標籤:數位簽章   訊息摘要   安全   dsa   rsa   

   數位簽章能夠驗證資料完整性、認證資料來源,並起到抗否認的作用,這3點與OSI參考模型中的資料完整性服務、認證(鑒別)服務和抗否認性服務相對應。訊息摘要演算法是驗證資料完整性的最佳演算法,因此,該演算法成為數位簽章中的必要組成部分。

   基於資料完整性驗證,我們希望資料的發送方可以對自己所發送的資料做相應的簽名處理,同時給出對應的憑證(簽名),並且資料的接收方可以驗證該簽名是否與資料發送方發送的資料相符。如何任何人都可以進行簽名處理,那麼簽名就失去了驗證的意義。所以,簽名操作只能是由資料發送方來完成,而驗證簽名的操作則由資料接收方來完成。既然簽名操作僅限於資料發送方,那麼簽名操作本身只能是基於資料發送方的某些私人資訊完成的。並且,用於驗證操作的相關資訊是由資料發送方公布給資料接收方的。

   用於簽名的相關資訊私人,用於驗證的相關資訊公開,且這兩種資訊必須成對出現。非對稱式加密中的公開金鑰與私密金鑰恰好滿足這種關係,因此成為了數位簽章中的重要元素。數位簽章演算法包含簽名與驗證兩項操作,遵循“私密金鑰簽名,公開金鑰驗證”的簽名/驗證方式,簽名時需要使用私密金鑰和待簽名資料,驗證時則需要公開金鑰、簽名值和待簽名驗證資料,其核心演算法主要是訊息摘要演算法。

   下面就看一個Java使用數位簽章的例子:

package com.xtayfjpk.security;import java.io.EOFException;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.security.Key;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey;import java.security.Signature;import java.util.ArrayList;import java.util.List;import org.junit.Test;public class SignatureTest {private static final String KEY_PAIR_ALGOGRITHM = "DSA";private static final String SIGNATURE_ALGOGRITHM = "SHA1withDSA";private static final String PUBLIC_KEY_PATH = "public.key";private static final String PRIVATE_KEY_PATH = "private.key";private static final String SIGNATURE_PATH = "signature.dat";@Test //產生公開金鑰與私密金鑰並儲存至檔案public void testGenerateKeyPair() throws Exception {KeyPairGenerator generator = KeyPairGenerator.getInstance(KEY_PAIR_ALGOGRITHM);KeyPair keyPair = generator.generateKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();writeKey(PUBLIC_KEY_PATH, publicKey);writeKey(PRIVATE_KEY_PATH, privateKey);}@Testpublic void testSign() throws Exception {String myInfo = "我的測試資訊";PrivateKey privateKey = PrivateKey.class.cast(readKey(PRIVATE_KEY_PATH));//初始化一個Signature對象,並用私密金鑰對資訊簽名,JDK(7)支援的數位簽章演算法有很多,//具體可參見http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#SignatureSignature signature = Signature.getInstance(SIGNATURE_ALGOGRITHM);//私密金鑰簽名signature.initSign(privateKey);//更新待簽名資料signature.update(myInfo.getBytes());//得到數位簽章byte[] signed = signature.sign();//把資訊和簽名儲存在一個檔案中writeObjects(SIGNATURE_PATH, myInfo, signed);}@Testpublic void testVerify() throws Exception {PublicKey publicKey = PublicKey.class.cast(readKey(PUBLIC_KEY_PATH));List<Object> objects = readObjects(SIGNATURE_PATH);String info = String.class.cast(objects.get(0));byte[] signed = byte[].class.cast(objects.get(1));//初始化簽名引擎類Signature signature = Signature.getInstance(SIGNATURE_ALGOGRITHM);//公開金鑰用於驗證簽名signature.initVerify(publicKey);//更新待待簽名驗證資料signature.update(info.getBytes());//測試簽名是否正確System.out.println(signature.verify(signed) ? "簽名正確" : "簽名錯誤");}public void writeKey(String path, Key key) throws Exception {FileOutputStream fos = new FileOutputStream(path);ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject(key);oos.close();}public Key readKey(String path) throws Exception {FileInputStream fis = new FileInputStream(path);ObjectInputStream bis = new ObjectInputStream(fis);Object object = bis.readObject();bis.close();return (Key) object;}public void writeObjects(String path, Serializable... objects) throws Exception {if(objects!=null) {ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));for(Serializable object : objects) {oos.writeObject(object);}oos.close();}}public List<Object> readObjects(String path) throws Exception {List<Object> objects = new ArrayList<>();ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));boolean flag = true;while(flag) {try {objects.add(ois.readObject());} catch (EOFException e) {//表示流中已無對象可讀break;}}ois.close();return objects;}}


Java安全之數位簽章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.