posted @ 2008-07-11 11:25 Stanley Sun 閱讀(335) | 評論 (0) | 編輯 收藏
眾所周知在計算機中所有的數據都是以二進制的方式存儲的。不管是int,String,float等等不同的數據類型,最終都會保存為01的形式。那么為什么要使用這種方式儲存數據呢?
因為計算機是一種電子設備,由復雜的電子元器件組合而成,一個電子元器件有帶電和不帶電兩種狀態,通常我們將帶電狀態表示為數值1,不帶電狀態表示為數值0,多個這樣的元器件的組合可以表示更多狀態,也就是可以表示更多的數據,如000表示0,001表示1,010表示2,011表示3,依此類推,111表示 7,一個元器件可表示一位(bit)數據,這種表示數據的方式就叫二進制。
在實際的電子設備中,我們將8個這樣的元器件形成一個單元,這樣的單元叫一個字節(byte),一個字節能表示多少個數呢?表示數值的范圍是0-255。
一個字節由8個二進位組成,其中最右邊的一位稱為“最低有效位”或“最低位”,最左邊的一位稱為“最高有效位”或“最高位”。每一個二進位的值是0或1。
二進制計數的缺點:書寫太長,容易出錯,一般計算機的數據位數都是4的整數倍,所以,在計算機里通常采用16進制計數法。用數字可以表示各種信息,計算機里只有數值,當你在內存中看到一個數值時,這個數值可能代表各種意義,生活中的數值也可以代表其他意義,如1234可以代表密碼,存款額,電報信息,根據上下線索,我們就能夠知道這數值代表的意義
但是在Java中到底是如何去保存數據的呢?下面我就以int數據類型為例說明Java的方式。
大家都知道在Java中規定1 int = 4 byte, 1 byte = 8 bit。以此推理那么1個int在計算機中就是以4 * 8 = 32位(bit)的方式存儲的。而又由于java中的int是屬于有符號類型(Java中不存在unsigned類型),所以32位的高一位是符號位,由此可以推理出int的儲存大小區間
Integer.MAX_VALUE = 2147483647(十進制) = 1111111 11111111 11111111 11111111(二進制)
Integer.MIN_VALUE = -2147483648(十進制) = 10000000 00000000 00000000 00000000(二進制)
現在我們知道了二進制的概念了,但是其實二進制我想我們想象的那么單純的表示的,他們是不同的表現方式如:原碼,反碼,補碼
將最高位作為符號位(以0代表正,1代表負),其余各位代表數值本身的絕對值(以二進制表示)。
為了簡單起見,我們用1個字節來表示一個整數。
+7的原碼為: 00000111
-7的原碼為: 10000111
一個數如果為正,則它的反碼與原碼相同;一個數如果為負,則符號位為1,其余各位是對原碼取反。
為了簡單起見,我們用1個字節來表示一個整數。
+7的反碼為: 00000111
-7的反碼為: 11111000
利用溢出,我們可以將減法變成加法。
對于十進制數,如果從9得到結果5,可以用減法:
9-4=5
因為4+6=10,我們將6作為4的補數,將上式的減法改寫為加法:
9+6=15
去掉高位1(也就是減去10),得到結果5。
對于16進制數,如果從C得到結果5,可以用減法:
C-7=5
因為7+9=16,我們將9作為7的補數,將上式的減法改寫為加法:
C+9=15
去掉高位1(也就是減去16),得到結果5。
在計算機中,如果我們用1個字節表示一個數,一個字節有8位,超過8位就進1,在內存中情況為:
1 00000000
進位1被丟棄。
一個數如果為正,則它的原碼、反碼、補碼相同;一個數如果為負,則符號位為1,其余各位是對原碼取反,然后整個數加1。
為了簡單起見,我們用1個字節來表示一個整數。
+7的補碼為: 00000111
-7的補碼為:第一步:11111000 (符號位為,其余各位取反)
第二步:11111001 (整個數加1)
+0的補碼:00000000;
-0的補碼:11111111;(第一步)
100000000;(第二步)
已知一個負數的補碼,將其轉換為十進制數,步驟:
1、先對各位取反;
2、將其轉換為十進制數;
3、加上負號,再減去1。
例如:
11111010,最高位為1,是負數,先對各位取反得00000101,轉換為十進制數得5,加上負號得-5,再減1得-6。
那么我們就知道了1與-1的二進制形式分別為0000000 00000000 00000000 00000001和11111111 11111111 11111111 11111111(Java中的數據是以補碼的形式儲存的)了。那么現在我們知道了數據是如何儲存的了。那么計算機是如何利用這些數據進行計算的呢?我們知道在計算機的CPU中只有一個加法器,所有的運算都是需要它進行的。所以在計算機里所有的加減乘除都是轉換成加法來進行運算的。那么它們是怎么轉換的呢?下面我們介紹一下二進制的運算操作
為了方便對二進制位進行操作,Java給我們提供了四個二進制位操作符:
& 按位與
| 按位或
^ 按位異或
~ 按位取反
一個房間里有兩個開關控制房間的燈的明暗。當兩個開關同時處于打開狀態時,燈才能亮。
開關1 開關2 燈的狀態
關 關 暗
開 關 暗
關 開 暗
開 開 亮
結論:按位與,只有壹(1)壹(1)為1。
一個房間里有兩個開關控制房間的燈的明暗。當任何一個開關處于打開狀態時,燈就能亮。
開關1 開關2 燈的狀態
關 關 暗
開 關 亮
關 開 亮
開 開 亮
結論:按位或,只有零(0)零(0)為0。
一個房間里有兩個開關控制房間的燈的明暗。當兩個開關處于不同狀態時,燈就能亮。
開關1 開關2 燈的狀態
關 關 暗
開 關 亮
關 開 亮
開 開 暗
結論:按位異或,只有零(0)壹(1)或壹(1)零(0)為1。
結論:對二進制數按位取反,即0變成1,1變成0。
左移:<< (相當于 乘以2)
帶符號右移:>> (相當于 除以2)
無符號右移:>>>
數 x x<<2 x>>2 x>>>2
17 00010001 00 01000100 00000100 01 00000100 01
-17 11101111 11 10111100 11111011 11 00111011 11
posted @ 2008-06-14 15:25 Stanley Sun 閱讀(1071) | 評論 (0) | 編輯 收藏
概念:
1.數字摘要:解決在安全的通信環境下,保證信息的唯一的一種方式。通常使用MD5/SHA-1等算法完成摘要。一般比如大家在網上下載軟件光盤時都會看到一個MD5值就是起到這個數字摘要的作用。在網絡的環境中發送者把消息和數字摘要一同發送給接收者,接收者使用發送者相同的算法對消息加密,看是否與發送者發送過來的數字摘要相同,如果相同就證明消息沒有給篡改過。下面是一個最為簡單的示例:
import java.security.*; public class myDigest { public static void main(String[] args) { myDigest my=new myDigest(); my.testDigest(); } public void testDigest() { try { String myinfo="我的測試信息"; //java.security.MessageDigest alg=java.security.MessageDigest.getInstance("MD5"); java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1"); alga.update(myinfo.getBytes()); byte[] digesta=alga.digest(); System.out.println("本信息摘要是:"+byte2hex(digesta)); //通過某中方式傳給其他人你的信息(myinfo)和摘要(digesta) 對方可以判斷是否更改或傳輸正常 java.security.MessageDigest algb=java.security.MessageDigest.getInstance("SHA-1"); algb.update(myinfo.getBytes()); if (algb.isEqual(digesta,algb.digest())) { System.out.println("信息檢查正常"); } else { System.out.println("摘要不相同"); } } catch (java.security.NoSuchAlgorithmException ex) { System.out.println("非法摘要算法"); } } public String byte2hex(byte[] b) //二行制轉字符串 { String hs=""; String stmp=""; for (int n=0;n<b.length;n++) { stmp=(java.lang.Integer.toHexString(b[n] & 0XFF)); if (stmp.length()==1) hs=hs+"0"+stmp; else hs=hs+stmp; if (n<b.length-1) hs=hs+":"; } return hs.toUpperCase(); } }
2.電子簽名:對數據信息的發生者身份的認定,它是一種抽象的概念而不是一種具體技術。實現電子簽名的技術手段目前有多種,比如基于公鑰密碼技術的數字簽名;或用一個獨一無二的以生物特征統計學為基礎的識別標識,例如手印、聲音印記或視網膜掃描的識別;手書簽名和圖章的電子圖象的模式識別;表明身份的密碼代號(對稱算法);基于量子力學的計算機等等。
3.數字簽名:所謂數字簽名就是利用通過某種密碼運算生成的一系列符號及代碼組成電子密碼進行"簽名",來代替書寫簽名或印章,對于這種電子式的簽名在技術上還可進行算法驗證,其驗證的準確度是在物理世界中與手工簽名和圖章的驗證是無法相比的。一般實現數字簽名的方法是通過生成的密鑰對的私鑰對用戶生成的數字消息進行DSA(Digital Signature Algorithm (DSA)是Schnorr和ElGamal簽名算法的變種,被美國NIST作為DSS(DigitalSignature Standard))加密實現的。實現代碼如下:
*/ import java.security.*; import java.security.spec.*; public class testdsa { public static void main(String[] args) throws java.security.NoSuchAlgorithmException,java.lang.Exception { testdsa my=new testdsa(); my.run(); } public void run() { //數字簽名生成密鑰 //第一步生成密鑰對,如果已經生成過,本過程就可以跳過,對用戶來講myprikey.dat要保存在本地 //而mypubkey.dat給發布給其它用戶 if ((new java.io.File("myprikey.dat")).exists()==false) { if (generatekey()==false) { System.out.println("生成密鑰對敗"); return; }; } //第二步,此用戶 //從文件中讀入私鑰,對一個字符串進行簽名后保存在一個文件(myinfo.dat)中 //并且再把myinfo.dat發送出去 //為了方便數字簽名也放進了myifno.dat文件中,當然也可分別發送 try { java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("myprikey.dat")); PrivateKey myprikey=(PrivateKey)in.readObject(); in.close(); // java.security.spec.X509EncodedKeySpec pubX509=new java.security.spec.X509EncodedKeySpec(bX509); //java.security.spec.X509EncodedKeySpec pubkeyEncode=java.security.spec.X509EncodedKeySpec String myinfo="這是我的信息"; //要簽名的信息 //用私鑰對信息生成數字簽名 java.security.Signature signet=java.security.Signature.getInstance("DSA"); signet.initSign(myprikey); signet.update(myinfo.getBytes()); byte[] signed=signet.sign(); //對信息的數字簽名 System.out.println("signed(簽名內容)="+byte2hex(signed)); //把信息和數字簽名保存在一個文件中 java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myinfo.dat")); out.writeObject(myinfo); out.writeObject(signed); out.close(); System.out.println("簽名并生成文件成功"); } catch (java.lang.Exception e) { e.printStackTrace(); System.out.println("簽名并生成文件失敗"); }; //第三步 //其他人通過公共方式得到此戶的公鑰和文件 //其他人用此戶的公鑰,對文件進行檢查,如果成功說明是此用戶發布的信息. // try { java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("mypubkey.dat")); PublicKey pubkey=(PublicKey)in.readObject(); in.close(); System.out.println(pubkey.getFormat()); in=new java.io.ObjectInputStream(new java.io.FileInputStream("myinfo.dat")); String info=(String)in.readObject(); byte[] signed=(byte[])in.readObject(); in.close(); java.security.Signature signetcheck=java.security.Signature.getInstance("DSA"); 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();}; } //生成一對文件myprikey.dat和mypubkey.dat---私鑰和公鑰, //公鑰要用戶發送(文件,網絡等方法)給其它用戶,私鑰保存在本地 public boolean generatekey() { try { java.security.KeyPairGenerator keygen=java.security.KeyPairGenerator.getInstance("DSA"); // SecureRandom secrand=new SecureRandom(); // secrand.setSeed("tttt".getBytes()); //初始化隨機產生器 // keygen.initialize(576,secrand); //初始化密鑰生成器 keygen.initialize(512); KeyPair keys=keygen.genKeyPair(); // KeyPair keys=keygen.generateKeyPair(); //生成密鑰組 PublicKey pubkey=keys.getPublic(); PrivateKey prikey=keys.getPrivate(); java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myprikey.dat")); out.writeObject(prikey); out.close(); System.out.println("寫入對象 prikeys ok"); out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("mypubkey.dat")); out.writeObject(pubkey); out.close(); System.out.println("寫入對象 pubkeys ok"); System.out.println("生成密鑰對成功"); return true; } catch (java.lang.Exception e) { e.printStackTrace(); System.out.println("生成密鑰對失敗"); return false; }; } public String byte2hex(byte[] b) { String hs=""; String stmp=""; for (int n=0;n<b.length;n++) { stmp=(java.lang.Integer.toHexString(b[n] & 0XFF)); if (stmp.length()==1) hs=hs+"0"+stmp; else hs=hs+stmp; if (n<b.length-1) hs=hs+":"; } return hs.toUpperCase(); } } 把他的公鑰的信息及簽名發給其它用戶
4.PKI(公鑰基礎設施):
posted @ 2007-12-05 22:09 Stanley Sun 閱讀(539) | 評論 (1) | 編輯 收藏
安裝完成之后打開window->show views-Task Repositories,界面如下圖:
在空白處右鍵點擊add task repository添加知識庫,如圖:
選中Jira,下一步:
server中填寫Jira的地址(http://ycfd.3322.org:88/jira),label隨便填寫,User ID和Password就是你在Jira上注冊的帳號和密碼了,填寫完畢之后點Validate Setting,驗證成功之后點完成即可。
在添加完repository后,會彈出添加query界面。如圖:
選擇create query using form后點擊next,進入query設置界面,如圖:
在project中選中fms后點擊finish。這樣就完成了各項設置
之后打開tasklist視圖:window->show view->other->mylyn->task list
點擊OK,后打開task list視圖,如圖:
在Task List中你可以看到你的項目中的問題和任務等,雙擊Task會顯示該Task的詳細情況:
在Task List中還能新建Task并提交到Jira,這里就不多說了,大家自己嘗試一下。
posted @ 2007-12-03 16:38 Stanley Sun 閱讀(1359) | 評論 (0) | 編輯 收藏
mylyn是一款開源的基于eclipse開發平臺的任務管理組件,可以制定自己的本地任務及在遠程服務器(其中包括Bugzilla、Trac 和 JIRA等)中的遠程任務。對于我們現在的項目,使用mylyn就可以方便我們直接的瀏覽在JIRA中的任務,而不必經常的登錄JIRA平臺了。提高了大家的工作效率。
由于mylyn與在我們現在在項目中使用的eclipse開發平臺中springide插件有沖突問題,所以首先大家需要把springide插件從eclipse中卸載。步驟如下:
1.在eclipse安裝目錄下找到一個名為links的文件夾,在這個文件夾中刪除Springide.link文件。
2.啟動eclipse,不過與平常不同的是需要在eclipse啟動命令中加入-clean參數。可以直接加入到eclipse快捷方式的目標項中。
此時eclipse會把springide插件卸載,之后我們就可以安裝mylyn插件了。在開始安裝mylyn之前,大家需要下載附件中的如下三個文件:mylyn-2.1-e3.3.zip,mylyn-2.1-extras.zip,springide_updatesite_2.0.1_v200708152145.zip
步驟如下:
1.設置本地插件歸檔:進入help->software updates->find and install菜單后,選擇search for new features to install后點擊next
進入install界面,如下圖:
把下載的三個zip歸檔加入后,點擊finish.
2.在彈出的updates窗口中選中剛才加入的三個歸檔,并把springide->integrations->spring ide ajdt integrations去掉后,如下圖:
之后進入授權界面,選擇i accept后next,如圖:
3.在彈出的verification窗口中點擊install all開始安裝,如圖:
之后提示是否重啟eclipse,點擊是。
posted @ 2007-12-03 16:38 Stanley Sun 閱讀(5518) | 評論 (0) | 編輯 收藏
EJBCA是一個全功能的CA系統軟件,它基于J2EE技術,并提供了一個強大的、高性能并基于組件的CA。EJBCA兼具靈活性和平臺獨立性,能夠獨立使用,也能和任何J2EE應用程序集成。
所需軟件:
1.jdk 1.5 下載地址:http://java.sun.com/
2.jboss-4.2.0.GA 下載地址:http://www.jboss.com/
3.jce_policy-1_5_0:下載地址:http://java.sun.com/
4.apache-ant-1.7.0:http://ant.apache.org/
5.oracle 10G:
6.ojdbc14.jar:
7.ejbca 3.4.5: 下載地址:http://ejbca.sourceforge.net
安裝步驟:
1.安裝jdk,jboss,ant,oracle,并把jce,jdbc解壓分別解壓到%JAVA_HOME%\jre\lib\security\與%JBOSS_HOME%\server\default\lib\。
2.設置環境變量,我的配置為:
ANT_HOME=C:\tool\ejbca\apache-ant-1.7.0-bin\apache-ant-1.7.0 EJBCA_HOME=C:\tool\ejbca\ejbca_3_5_2\ejbca_3_5_2 JBOSS_HOME=C:\tool\ejbca\jboss-4.2.0.GA\jboss-4.2.0.GA JAVA_HOME=C:\Program Files\Java\jdk1.6.0_03 path=%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\tool\ejbca\apache-ant-1.7.0-bin\apache-ant-1.7.0\bin;C:\tool\ejbca\jboss- 4.2.0.GA\jboss-4.2.0.GA\bin;C:\Program Files\Java\jdk1.6.0_03\bin classpath=C:\Program Files\Java\jdk1.6.0_03\lib\tools.jar
3.在數據庫中創建表空間并添加用戶EJBCA,在ORACLE中的代碼為:
創建表空間:
CREATE TABLESPACE EJBCA DATAFILE 'EJBCA.dbf' SIZE 100m ;
創建用戶:
CREATE user EJBCA identified by "EJBCA" default tablespace USERS temporary tablespace TEMP profile DEFAULT; -- Grant/Revoke role privileges grant aq_administrator_role to EJBCA with admin option; grant dba to EJBCA with admin option; -- Grant/Revoke system privileges grant unlimited tablespace to EJBCA with admin option;
4.刪除所有的ejbca\adminweb中的jsp(%EJBCA_HOME%\src\adminweb*.jsp)中的
<%@ page pageEncoding="ISO-8859-1"%>
以解決中文亂碼問題,下一步也是解決此類問題。
5.把%EJBCA_HOME%\conf\ejbca.properties.sample改名為ejbca.properties,并在ejbca.properties添加如下一行:
web.contentencoding=GBK
6.把%EJBCA_HOME%\conf\database.properties.sample改名為database.properties,并更改相應的數據庫配置。如下是我的配置:
datasource.jndi-name=EjbcaDS datasource.jndi-name-prefix=java:/ database.name=oracle datasource.mapping=Oracle9i database.url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL database.driver=oracle.jdbc.driver.OracleDriver database.username=ejbca database.password=ejbca
注:datasource.mapping需要選擇與oracle實際版本最接近的版本。
7.在%EJBCA_HOME%\bin中,通過cmd運行ant bootstrap。
8.啟動jboss,在%JBOSS_HOME%\bin,通過cmd運行run。
9.在%EJBCA_HOME%\bin中,通過cmd運行ant install。
10.關閉jboss,并在在%EJBCA_HOME%\bin中,通過cmd運行ant deploy。
11.再次啟動jboss,在%JBOSS_HOME%\bin,通過cmd運行run。
13.導入在%EJBCA_HOME%\p12目錄中superadmin.p12,默認密碼為ejbca。
注:在第7步時,如出現ANT失敗,可能是由于ejbca的版本問題,推薦使用ejbca3.4.5。
posted @ 2007-12-03 16:33 Stanley Sun 閱讀(1610) | 評論 (0) | 編輯 收藏