Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學(xué);靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
          <2008年2月>
          272829303112
          3456789
          10111213141516
          17181920212223
          2425262728291
          2345678

          常用鏈接

          留言簿(19)

          隨筆分類(107)

          隨筆檔案(141)

          文章分類(284)

          文章檔案(342)

          相冊

          收藏夾(58)

          家裝

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          通過我昨天的文章大家應(yīng)該已經(jīng)清楚了,用Java寫信息安全方面的程序需要做的準(zhǔn)備工作.好了,現(xiàn)在假設(shè)你已經(jīng)是一個對Java語言本身比較熟悉,能夠用Java寫一些程序的人,并且這些該下載的jar包已經(jīng)下載好了,可以正式開工了.

              在所有的此類程序的開頭(無論是在類的構(gòu)造函數(shù)中也好,在初始化函數(shù)中也好),都要先來上這么一句:Security.addProvider(new BouncyCastleProvider());將BouncyCaslte的Provider添加到系統(tǒng)中,這樣以后系統(tǒng)在運(yùn)行相關(guān)程序的時候調(diào)用的 就是這個Provider中的加密算法.

              然后我們就可以開始開CA了.首先,作為一個CA要有自己的一對公鑰和私鑰,我們先要生成這么一對.使用KeyPairGenerator對象就可以了, 調(diào)用KeyPairGenerator.getInstance方法可以根據(jù)要生成的密鑰類型來產(chǎn)生一個合適的實(shí)例,例如常用的RSA,DSA等.然后調(diào) 用該對象的initialize方法和generateKeyPair方法就可以產(chǎn)生一個KeyPair對象了.然后調(diào)用KeyPair對象中的相應(yīng)方法 就可以獲取生成的密鑰對中的公鑰和私鑰了.

              有了公鑰和私鑰對以后,下面的一個很現(xiàn)實(shí)問題就是如何把它們儲存起來.通常我們要對這些安全對象,如公鑰,私鑰,證書等先進(jìn)行編碼.編碼的目的是為了把結(jié) 構(gòu)復(fù)雜的安全對象變成字節(jié)流以便存儲和讀取,如DER編碼.另外,通常還把DER編碼后的字節(jié)流再次進(jìn)行base64編碼,以便使字節(jié)流中所有的字節(jié)都變 成可打印的字節(jié).

              在Java語言中,這些安全對象基本上都有g(shù)etEncoded()方法.例如:

              byte[] keyBytes = privateKey.getEncoded();

              這樣就把一個私鑰進(jìn)行了DER編碼后的結(jié)果保存到一個byte數(shù)組中了.然后就可以把這個byte數(shù)組保存到任何介質(zhì)中.如果有必要的話,可以使用BC Provider中的Base64編碼解碼器類進(jìn)行編碼,就像這樣:

              byte data[] = Base64.encode(keyBytes);

              要從文件中讀取私鑰則應(yīng)該這樣:

              PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyData);
              KeyFactory kfac = KeyFactory.getInstance("RSA");
              privateKey = kfac.generatePrivate(spec);

              這里說明一下,對RSA私鑰進(jìn)行編碼就會自動地按照PKCS8進(jìn)行.因此讀取的時候?qū)幋a的字節(jié)數(shù)組作為PKCS8EncodedKeySpec對象 的構(gòu)造函數(shù)的參數(shù)就可以生成一個該類型的對象.然后創(chuàng)建一個密鑰工廠對象就可以按照要求生成一個RSA私鑰了.很顯然這里的keyData應(yīng)該是和上面的 keyBytes內(nèi)容相同.

              為了提高系統(tǒng)的安全性,通常私鑰在經(jīng)過DER編碼后,還會使用一個口令進(jìn)行加密,然后再儲存在文件系統(tǒng)中.在使用私鑰的時候,如果沒有正確的口令,是無法把私鑰還原出來的.

              保存證書和保存私鑰類似.Certificate對象中也有一個getEncoded的方法.

              這次就講這些.大家應(yīng)該可以把這些安全對象很熟練地從文件系統(tǒng)和內(nèi)存之間來回地折騰了吧.這對以后實(shí)現(xiàn)CA是很重要的.下次我會講一下證書中表示主體的方法:DN.
          posted on 2008-02-13 22:11 禮物 閱讀(2370) 評論(0)  編輯  收藏 所屬分類: CA
          主站蜘蛛池模板: 托克逊县| 东阿县| 天峨县| 女性| 行唐县| 曲水县| 家居| 永嘉县| 荣昌县| 凤冈县| 军事| 文成县| 辽中县| 克东县| 五寨县| 原平市| 商都县| 大兴区| 珠海市| 东光县| 天峻县| 松溪县| 健康| 万安县| 胶州市| 富川| 墨玉县| 勃利县| 鹤庆县| 肇东市| 鱼台县| 固原市| 桐庐县| 林芝县| 托里县| 榆社县| 南和县| 永吉县| 大同市| 安平县| 桃园市|