jsp頁面的代碼:
我要把這個控件發布的web工程中
1,首先復制cab到web目錄下,然后再頁面中添加控件信息,如下圖,
其中上面注釋掉的lpk這段根據他的描述生成了相應的lpk文件,將代碼放到jsp頁面中,部署。
2,部署后查看測試效果,但是效果不盡如人意,提示“非安全控件”而且也無法安裝,這是由于控件沒有認證,認證還是需要花錢的,自然不行。
3,只能通過本地注冊控件的方式,這樣就不需要ie的認證,但是控件提示的信息也是“無法識別的控件”。
4,使用installshield9來制作客戶端注冊包,具體的不說了只要注意一個個問題。注冊控件的腳步
這樣注冊后,客戶端使用就不會有提示,我上面提到了,我自己生成了lpk文件,我也加到頁面中了。
但是如果加這句雖然控件可以使用,但是總會有安全提示,很影響使用效果。所以暫時把它去掉了。
1,在今天整理代碼的時候,發現原來的一段代碼,前臺合并單元格。
需要在后端,原來的列表基礎上,再增加一層。
頁面上操作,struts2
這樣根據code在頁面上就會顯示分組合并單元格的效果。
今天解決了一個問題(如題),這個問題一致沒有解決,以前的項目中也遇到過但是都沒有花時間去研究,這回徹底的整理了一下。問題如:一個老師類(Teacher)和一個學生類(User),一個老師有多個學生,當然這個例子不夠好,不管怎樣就是這個意思,老是對應多個學生,oneto many
<set name="users" inverse="true" order-by="column" ><!-- sort="natural" -->
<key>
<column name="teacher_id" length="36">
<comment>老師表主鍵</comment>
</column>
</key>
<one-to-many class="User" />
</set>
以前遇到這個問題,都是通過lazy=false來實現,雖然能實現效果但是效率上會有問題也會產生N+1的查詢問題。
我一致比較喜歡使用 hibernate的 left join fetch 方式來抓取結構,但是我現在是要在查詢老師的列表中顯示他所有的學生,如果用 select teacher from Teacher teacher left join fetch teacher.users這樣的方式來得到學生集合,這樣老師的數據集合會有重復數據,不知我這樣說是否理解,如果遇到我這樣的問題應該比較了解了,使用了很多方法也沒有通過,當然實現這個效果可以有別的方式(虛列方式,或這采用 native sql ),我現在就是針對這種抓取的方式(暫時還是沒有找到方案,如果知道的可以告訴我),我現在采用的方式還是上面的抓取方式,出現的重復數據,我把結果集拿出來之后,把重復的數據過濾掉,這樣暫時能解決問題。然后是后面的出去的users 排序的問題,默認我們使用的set set大家都知道是沒有順序的,我們一種方式是 order-by="column" 上面的,采用這種方式來實現排序,另一種方式是采用 sort="natural" 方式來實現,但是如果要用sort方式就需要實現compareble 接口 實現 compareTo 方法 來自定義比較的規則,第二種方式我試驗一下有點問題,他們的原理都是通過這兩個規則 指定set最后的實現類 。
就可以使用延遲加載了,spring通過filter的方式對綁定hibernate session 到request的線程中。
that binds a Hibernate Session to the thread for the entire processing of the request
剛開始我是把上面這段配置隨便放到web.xml中,一致不成功總報session 關閉,不起作用,最后查了一下,我把這個filter放到了struts的filter之上,就可以了。
說明FlushMode有五種屬性
1 NEVEL
2 MANUAL
3 AUTO
4 COMMIT
5 ALWAYS
我用的是Struts2基類代碼,如下
先說一下:
一,struts2的ModelDriven (下面來源網絡)
可以根據Action屬性的不同將它分為兩類:Field-Driven(屬性驅動) Action和Model-Driven(模型驅動) Action。
一、Field-Driven(屬性驅動)Action,Action擁有自己的屬性,這些屬性一般是Java的基本類型。表單字段直接和Action的屬性 對應。
二、實現了modelDriven接口可以在action中直接獲得例如User對象,它會將Object getModel()取得的User放到ValueStack中。可以理解為將這個User的屬性追加到Action中。它主要是作用是實現類似 Struts的FormBean功能。
在struts2中,提供了一種直接使用領域對象的方式,就是讓action實現com.opensymphony.xwork2.ModelDriven接口,ModelDriven讓你可以直接操作應用程序中的領域對象,允許你在web層和業務層使用相同的對象。
ModelDriven接口只有一個方法
public Object getModel() {
return null;
}
該方法返回一個用于接收用戶輸入數據的對象模型,在這個模型對象中的屬性可以直接通過(屬性名)userName來訪問,而不需要使用(對象名.屬 性名)user.userName這種格式來訪問了,在action也不需要對對象提供getter和setter方法了,但是必須要在action中進 行new操作
如下
// ModelDriven要使用泛型哦
public class LoginAction extends ActionSupport implements ModelDriven<User>{
private static final long serialVersionUID = -6434128483294080524L;
//這里必須要new
private User user=new User();
public String login() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
//這里是實現接口方法
@Override
public User getModel() {
// TODO Auto-generated method stub
//別忘記了,要把返回值寫上哦
return user;
}
}
這樣一個ModelDriven就實現完畢了
和屬性驅動的Action有很大的區別,下面一一列舉:
(1)模型驅動的Action必須實現ModelDriven接口,而且要提供相應的泛型,這里當然就是具體使用的Java Bean了。
(2)實現ModelDriven的getModel方法,其實就是簡單的返回泛型的一個對象。
(3)在Action提供一個泛型的私有對象,這里就是定義一個User的user對象,并提供相應的getter與setter。
好了,上面的三件事做完之后,Action就會去自動調用User的setter將表單中的name屬性的值賦給User中的屬性。而Action的后續處理的Jsp頁面后者是Servlet就可以使用user對象了。
到底是用屬性驅動和是模型驅動呢?
這個問題困擾了很多Struts2的初學者,我這里提供一些建議:
(1)請你統一整個系統中的Action使用的驅動模型,即要么都是用屬性驅動,要么都是用模型驅動。
(2)如果你的DB中的持久層的對象與表單中的屬性都是一一對應的話,那么就使用模型驅動吧,畢竟看起來代碼要整潔得多。
(3)如果表單的屬性不是一一對應的話,那么就應該使用屬性驅動,否則,你的系統就必須提供兩個Bean,一個對應表單提交的數據,另一個用與持久層。
二,持久層基類 HibernateDao
代碼如:
上面的代碼,基類沒有使用HibernateDaoSupport,我們需要自己引入SessionFactory。
持久層基類,一般Spring的Hibernate ORM 框架帶來了方便的HibernateDaoSupport類,你的DAO類可以繼承它:
public class DaoHibernate extends HibernateDaoSupport {
.................
}
如果你選擇這種設計,就需要動態注入SessionFactory而HibernateDaoSupport包含這個屬性.這個類提供了一個方便的方法getHibernateTemplate(); 就能得到HibernateTemplate的一個實例.它也有getSession()和releaseSession,以便于你應為某些原因而不使用HibernateTempate的情況下執行Hibernate操作。
HibernateDaoSupport提供了基于AOP事務的自動處理,程序員完全可以不用理會事務的開始與提交。在JDBC中一個Connection對象使用一個事務,那么在Hibernate中一個事務肯定要關聯一個SessionFactory了,然而這個SessionFactory卻沒有在DAO中體現。其實主要的原因是HibernateDaoSupport類已經默默地做了封裝的工作,它用一個setSessionFactory方法將SessionFactory進行注入,所以繼承自HibernateDaoSupport類的DAO都會具有SessionFactory的屬性,從而可以通過SessionFactory創建Session實例操作數據庫。
如果使用像 public class HibernateDao<T, PK extends Serializable> 這樣的泛型基類就會有問題,可以拿個T代表任意類型,Java的泛型拿不到T.class,就無法得到類對象, 如下面的clazz,
public T get(final PK id) {
Assert.notNull(id, "id不能為空");
return (T) getSession().load(clazz, id);
}
最后在網上找到了解決方案,可以使用泛型public class HibernateDao<T, PK extends Serializable>基類了。
重點這句: entityClass =(Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
數字簽名流程個圖
上面的圖描述了用戶A和用戶B間通訊流程。
1,用戶A將明文通過hash運算(散列)生成數字摘要1,用戶A用自己的私鑰對摘要進行加密生成數字簽名1.
2,用戶A將明文+數字簽名1+A用戶的公鑰(證書),準備將這些信息發到B用戶,但是這個過程中,用戶A明文是不安全的是可見的,我們需要對這三個文件進行加密。
3,用戶A通過一個“對稱加密”(對稱加密速度很快,知道密鑰就可以解密)對其進行加密將其生成秘文1,要想這次加密成功關鍵就是要保護這個對稱加密的密鑰1。
4,為了保證上面的加密安全,使用用戶B的公鑰對“對稱加密的密鑰1”進行了一次加密處理,生成一個數字信封1,此時這個數字信封1+秘文1打包裝入就可以發送給用B了。
5,用戶B接收到信,看到數字信封1+秘文1,用戶B用私鑰解密數字信封1,得到了“對稱加密的密鑰1”,通過這個對稱加密密鑰對秘文1解密,就可以解開密文。
6,解開秘文1解則看到了A將明文+數字簽名1+A用戶的公鑰(證書),這三個文件,這個時候已經可以確認是用戶A發的信息了,但是還要驗證文件在傳輸過程中是否被篡改。
7,用戶B將明文通過hash運算(散列)生成數字摘要2,同時用得到的A用戶的公鑰(證書)對數字簽名1進行解密生成原來的數字摘要1,如果此時的數字摘要1同數字摘要2相同那么說明整個過程是安全而有效的。
好的文章 http://www.ibm.com/developerworks/cn/java/l-security/
數字簽名以電子形式存在于數據信息之中的,或作為其附件的或邏輯上與之有聯系的數據,可用于辨別數據簽署人的身份,并表明簽署人對數據信息中包含的信息的認可。(摘自百度)
數字簽名(又稱公鑰數字簽名、電子簽章)是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領域的技術實現,用于鑒別數字信息的方法。一套數字簽名通常定義兩種互補的運算,一個用于簽名,另一個用于驗證
基本介紹 數字簽名不是指將你的簽名掃描成數字圖像,或者用觸摸板獲取的簽名,更不是你的落款。
數字簽名了的文件的完整性是很容易驗證的(不需要騎縫章,騎縫簽名,也不需要筆跡專家),而且數字簽名具有不可抵賴性(不需要筆跡專家來驗證)。
簡單地說,所謂數字簽名就是附加在數據單元上的一些數據,或是對數據單元所作的密碼變換。這種數據或變換允許數據單元的接收者用以確認數據單元的來源和數據單元的完整性并保護數據,防止被人(例如接收者)進行偽造。它是對電子形式的消息進行簽名的一種方法,一個簽名消息能在一個通信網絡中傳輸。基于公鑰密碼體制和私鑰密碼體制都可以獲得數字簽名,目前主要是基于公鑰密碼體制的數字簽名。包括普通數字簽名和特殊數字簽名。普通數字簽名算法有RSA、ElGamal、Fiat-Shamir、Guillou- Quisquarter、Schnorr、Ong-Schnorr-Shamir數字簽名算法、Des/DSA,橢圓曲線數字簽名算法和有限自動機數字簽名算法等。特殊數字簽名有盲簽名、代理簽名、群簽名、不可否認簽名、公平盲簽名、門限簽名、具有消息恢復功能的簽名等,它與具體應用環境密切相關。顯然,數字簽名的應用涉及到法律問題,美國聯邦政府基于有限域上的離散對數問題制定了自己的數字簽名標準(DSS)。
數字簽名(Digital Signature)技術是不對稱加密算法的典型應用。數字簽名的應用過程是,數據源發送方使用自己的私鑰對數據校驗和或其他與數據內容有關的變量進行加密處理,完成對數據的合法“簽名”,數據接收方則利用對方的公鑰來解讀收到的“數字簽名”,并將解讀結果用于對數據完整性的檢驗,以確認簽名的合法性。數字簽名技術是在網絡系統虛擬環境中確認身份的重要技術,完全可以代替現實過程中的“親筆簽字”,在技術和法律上有保證。在數字簽名應用中,發送者的公鑰可以很方便地得到,但他的私鑰則需要嚴格保密。
保證信息傳輸的完整性、發送者的身份認證、防止交易中的抵賴發生。
數字簽名技術是將摘要信息用發送者的私鑰加密,與原文一起傳送給接收者。接收者只有用發送的公鑰才能解密被加密的摘要信息,然后用HASH函數對收到的原文產生一個摘要信息,與解密的摘要信息對比。如果相同,則說明收到的信息是完整的,在傳輸過程中沒有被修改,否則說明信息被修改過,因此數字簽名能夠驗證信息的完整性。
數字簽名是個加密的過程,數字簽名驗證是個解密的過程。
報文的發送方用一個哈希函數從報文文本中生成報文摘要(散列值)。發送方用自己的私人密鑰對這個散列值進行加密。然后,這個加密后的散列值將作為報文的附件和報文一起發送給報文的接收方。報文的接收方首先用與發送方一樣的哈希函數從接收到的原始報文中計算出報文摘要,接著再用發送方的公用密鑰來對報文附加的數字簽名進行解密。如果兩個散列值相同、那么接收方就能確認該數字簽名是發送方的。通過數字簽名能夠實現對原始報文的鑒別。
數字簽名有兩種功效:一是能確定消息確實是由發送方簽名并發出來的,因為別人假冒不了發送方的簽名。二是數字簽名能確定消息的完整性。因為數字簽名的特點是它代表了文件的特征,文件如果發生改變,數字簽名的值也將發生變化。不同的文件將得到不同的數字簽名。 一次數字簽名涉及到一個哈希函數、發送者的公鑰、發送者的私鑰。
具有數字簽名功能的個人安全郵件證書是用戶證書的一種,是指單位用戶收發電子郵件時采用證書機制保證安全所必須具備的證書。個人安全電子郵件證書是符合x.509標準的數字安全證書,結合數字證書和S/MIME技術對普通電子郵件做加密和數字簽名處理,確保電子郵件內容的安全性、機密性、發件人身份確認性和不可抵賴性。 具有數字簽名功能的 個人安全郵件證書中包含證書持有人的電子郵件地址、證書持有人的公鑰、頒發者(CA)以及頒發者對該證書的簽名。個人安全郵件證書功能的實現決定于用戶使用的郵件系統是否支持相應功能。目前, MS Outlook 、Outlook Express、Foxmail及CA安全電子郵件系統均支持相應功能。使用個人安全郵件證書可以收發加密和數字簽名郵件,保證電子郵件傳輸中的機密性、完整性和不可否認性,確保電子郵件通信各方身份的真實性。
1.查看數字簽名的詳細信息,我們應該查看該數字簽名的詳細信息,點擊“詳細信息”按鈕即可。
我們會發現正常EXE和感染(或捆綁木馬)后的EXE數字簽名的區別
正常EXE的數字簽名詳細信息
被篡改后的EXE數字簽名信息無效
方法2,使用數字簽名驗證程序sigcheck.exe (可以百度一下找這個工具,著名系統工具包Sysinternals Suite的組件之一。)
數字簽名異常的結果為:
C:\Documents and Settings\litiejun\??\modify.exe:
Verified: Unsigned
File date: 15:46 2008-5-23
Publisher: n/a
Description: n/a
Product: n/a
Version: n/a
File version: n/a
數字簽名正常的結果為:
C:\Documents and Settings\litiejun\??\che.exe:
Verified: Signed
Signing date: 16:28 2008-4-29
Publisher: n/a
Description: n/a
Product: n/a
Version: n/a
File version: n/a
1,精心設計的感染
當EXE被感染時,是很容易破壞文件的數字簽名信息的,如果攻擊者感染或破壞文件時,有意不去破壞EXE中有關數字簽名的部分,就可能出現感染后,數字簽名看上去正常的情況。但認真查看文件屬性或校驗文件的HASH值,你會發現該EXE程序已經不是最原始的版本了。
2.該軟件發行商的數字簽名文件被盜,攻擊者可以把捆綁木馬或感染病毒后的EXE程序,也打包上數字簽名,這種情況下就更嚴重了。企業如果申請了數字簽名證書,一定要妥善保管,否則后患無窮。
你可以對你發出的每一封電子郵件進行數字簽名。這不是指落款,普遍把落款訛誤成簽名。
在我國大陸,數字簽名是具法律效力的,正在被普遍使用。2000年,中華人民共和國的新《合同法》首次確認了電子合同、電子簽名的法律效力。2005年4月1日起,中華人民共和國首部《電子簽名法》正式實施。
每個人都有一對“鑰匙”(數字身份),其中一個只有她/他本人知道(密鑰),另一個公開的(公鑰)。簽名的時候用密鑰,驗證簽名的時候用公鑰。又因為任何人都可以落款申稱她/他就是你,因此公鑰必須向接受者信任的人(身份認證機構)來注冊。注冊后身份認證機構給你發一數字證書。對文件簽名后,你把此數字證書連同文件及簽名一起發給接受者,接受者向身份認證機構求證是否真地是用你的密鑰簽發的文件。
在通訊中使用數字簽名一般基于以下原因:
公鑰加密系統允許任何人在發送信息時使用公鑰進行加密,數字簽名能夠讓信息接收者確認發送者的身份。當然,接收者不可能百分之百確信發送者的真實身份,而只能在密碼系統未被破譯的情況下才有理由確信。
鑒權的重要性在財務數據上表現得尤為突出。舉個例子,假設一家銀行將指令由它的分行傳輸到它的中央管理系統,指令的格式是(a,b),其中a是賬戶的賬號,而b是賬戶的現有金額。這時一位遠程客戶可以先存入100元,觀察傳輸的結果,然后接二連三的發送格式為(a,b)的指令。這種方法被稱作重放攻擊。
傳輸數據的雙方都總希望確認消息未在傳輸的過程中被修改。加密使得第三方想要讀取數據十分困難,然而第三方仍然能采取可行的方法在傳輸的過程中修改數據。一個通俗的例子就是同形攻擊:回想一下,還是上面的那家銀行從它的分行向它的中央管理系統發送格式為(a,b)的指令,其中a是賬號,而b是賬戶中的金額。一個遠程客戶可以先存100元,然后攔截傳輸結果,再傳輸(a,b3),這樣他就立刻變成百萬富翁了。
在密文背景下,抵賴這個詞指的是不承認與消息有關的舉動(即聲稱消息來自第三方)。消息的接收方可以通過數字簽名來防止所有后續的抵賴行為,因為接收方可以出示簽名給別人看來證明信息的來源。
數字簽名算法依靠公鑰加密技術來實現的。在公鑰加密技術里,每一個使用者有一對密鑰:一把公鑰和一把私鑰。公鑰可以自由發布,但私鑰則秘密保存;還有一個要求就是要讓通過公鑰推算出私鑰的做法不可能實現。
普通的數字簽名算法包括三種算法:
1.密碼生成算法 ;
2.標記算法 ;
3.驗證算法 。
1、將applet的class文件打包成*.jar(不會的可以在命令行中輸入jar查看幫助) [3]
2 首先我們要生成一個keystore 否則在簽名的時候報如下錯誤
jarsigner 錯誤: java.lang.RuntimeException: 密鑰庫裝入: C:\Documents and Settings\ij2ee\.keystore (系統找不到指定的文件。). (這邊的ij2ee 是我當前系統用戶名)
生成keystore的語句:keytool -genkey -alias 別名你可以自己寫 -keyalg RSA -keystore .keystore
比如我的就是 keytool -genkey -alias ij2ee -keyalg RSA -keystore .keystore
下面是會出現的數字簽名的一些步驟操作:
輸入keystore密碼:
再次輸入新密碼:
您的名字與姓氏是什么?
[Unknown]: ij2ee
您的組織單位名稱是什么?
[Unknown]: mtk
您的組織名稱是什么?
[Unknown]: mtk
您所在的城市或區域名稱是什么?
[Unknown]: suzhou
您所在的州或省份名稱是什么?
[Unknown]: jiangsu
該單位的兩字母國家代碼是什么
[Unknown]: cn
CN=jeson, OU=mtk, O=mtk, L=suzhou, ST=jiangsu, C=cn 正確嗎?
[否]: y
輸入<sfcs>的主密碼
(如果和 keystore 密碼相同,按回車):
這時候會在jdk的bin目錄下生成 .keystore 。把這個.keystore文件移動到 C:\Documents and Settings\當前系統用戶 的目錄下面。
3、創建一個數字證書
在命令行中輸入如下指令,peakCA和peakCALib自己起名字好了,3650是有效天數,就是10年左右,在創建證書的的時候,需要填寫證書的一些信息和證書對應的私鑰密碼。這些信息包括 CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx,都是中文,一看就懂的
keytool -genkey -alias peakCA -keyalg RSA -keysize 1024 -keystore peakCALib -validity 3650
4、將證書導出到證書文件中
在命令行中輸入如下指令,peakCA和peakCALib自己起名字好了,******是你輸入的密碼
keytool -export -alias peakCA -file peakCA.cer -keystore peakCALib -storepass ****** -rfc
5、授權jar文件,在命令行中輸入如下指令
jarsigner -keystore peakCALib myapplet.jar peakCA
這段時間在看書的時候,看到相關章節關于的安全方面的,里面涉及到了一些加密的算法,正好我現在的項目中也用到了相關的的東西,數字簽名等。今天把相關的搜集起來。以備后用。
根據密鑰類型不同將現代密碼技術分為兩類:對稱加密算法(秘密鑰匙加密)和非對稱加密算法(公開密鑰加密)。
對稱鑰匙加密系統是加密和解密均采用同一把秘密鑰匙,而且通信雙方都必須獲得這把鑰匙,并保持鑰匙的秘密。
非對稱密鑰加密系統采用的加密鑰匙(公鑰)和解密鑰匙(私鑰)是不同的。
對稱加密算法用來對敏感數據等信息進行加密,常用的算法包括:
DES(Data Encryption Standard):數據加密標準,速度較快,適用于加密大量數據的場合。
3DES(Triple DES):是基于DES,對一塊數據用三個不同的密鑰進行三次加密,強度更高。
AES(Advanced Encryption Standard):高級加密標準,是下一代的加密算法標準,速度快,安全級別高;
2000年10月,NIST(美國國家標準和技術協會)宣布通過從15種侯選算法中選出的一項新的密匙加密標準。Rijndael被選中成為將來的AES。 Rijndael是在 1999 年下半年,由研究員 Joan Daemen 和 Vincent Rijmen 創建的。AES 正日益成為加密各種形式的電子數據的實際標準。
美國標準與技術研究院 (NIST) 于 2002 年 5 月 26 日制定了新的高級加密標準 (AES) 規范。
AES 算法基于排列和置換運算。排列是對數據重新進行安排,置換是將一個數據單元替換為另一個。AES 使用幾種不同的方法來執行排列和置換運算。
AES 是一個迭代的、對稱密鑰分組的密碼,它可以使用128、192 和 256 位密鑰,并且用 128 位(16字節)分組加密和解密數據。與公共密鑰密碼使用密鑰對不同,對稱密鑰密碼使用相同的密鑰加密和解密數據。通過分組密碼返回的加密數據的位數與輸入數據相同。迭代加密使用一個循環結構,在該循環中重復置換和替換輸入數據。
算法名稱 |
算法類型 |
密鑰長度 |
速度 |
解密時間(建設機器每秒嘗試255個密鑰) |
資源消耗 |
AES |
對稱block密碼 |
128、192、256位 |
高 |
1490000億年 |
低 |
3DES |
對稱feistel密碼 |
112位或168位 |
低 |
46億年 |
中 |
常見的非對稱加密算法如下:
RSA:由 RSA 公司發明,是一個支持變長密鑰的公共密鑰算法,需要加密的文件塊的長度也是可變的;
DSA(Digital Signature Algorithm):數字簽名算法,是一種標準的 DSS(數字簽名標準);
ECC(Elliptic Curves Cryptography):橢圓曲線密碼編碼學。
在1976年,由于對稱加密算法已經不能滿足需要,Diffie 和Hellman發表了一篇叫《密碼學新動向》的文章,介紹了公匙加密的概念,由Rivet、Shamir、Adelman提出了RSA算法。
隨著分解大整數方法的進步及完善、計算機速度的提高以及計算機網絡的發展,為了保障數據的安全,RSA的密鑰需要不斷增加,但是,密鑰長度的增加導致了其加解密的速度大為降低,硬件實現也變得越來越難以忍受,這對使用RSA的應用帶來了很重的負擔,因此需要一種新的算法來代替RSA。
1985年N.Koblitz和Miller提出將橢圓曲線用于密碼算法,根據是有限域上的橢圓曲線上的點群中的離散對數問題ECDLP。ECDLP是比因子分解問題更難的問題,它是指數級的難度。
橢圓曲線上離散對數問題ECDLP定義如下:給定素數p和橢圓曲線E,對Q=kP,在已知P,Q 的情況下求出小于p的正整數k。可以證明由k和P計算Q比較容易,而由Q和P計算k則比較困難。
將橢圓曲線中的加法運算與離散對數中的模乘運算相對應,將橢圓曲線中的乘法運算與離散對數中的模冪運算相對應,我們就可以建立基于橢圓曲線的對應的密碼體制。
例如,對應Diffie-Hellman公鑰系統,我們可以通過如下方式在橢圓曲線上予以實現:在E上選取生成元P,要求由P產生的群元素足夠多,通信雙方A和B分別選取a和b,a和b 予以保密,但將aP和bP公開,A和B間通信用的密鑰為abP,這是第三者無法得知的。
對應ELGamal密碼系統可以采用如下的方式在橢圓曲線上予以實現:
將明文m嵌入到E上Pm點,選一點B∈E,每一用戶都選一整數a,0<a<N,N為階數已知,a保密,aB公開。欲向A送m,可送去下面一對數偶:[kB,Pm+k(aAB)],k是隨機產生的整數。A可以從kB求得k(aAB)。通過:Pm+k(aAB)- k(aAB)=Pm恢復Pm。同樣對應DSA,考慮如下等式:
K=kG [其中 K,G為Ep(a,b)上的點,k為小于n(n是點G的階)的整數]
不難發現,給定k和G,根據加法法則,計算K很容易;但給定K和G,求k就相對困難了。
這就是橢圓曲線加密算法采用的難題。我們把點G稱為基點(base point),k(k<n,n為基點G的階)稱為私有密鑰(privte key),K稱為公開密鑰(public key)。
ECC和RSA相比,在許多方面都有對絕對的優勢,主要體現在以下方面:
抗攻擊性強。相同的密鑰長度,其抗攻擊性要強很多倍。
計算量小,處理速度快。ECC總的速度比RSA、DSA要快得多。
存儲空間占用小。ECC的密鑰尺寸和系統參數與RSA、DSA相比要小得多,意味著它所占的存貯空間要小得多。這對于加密算法在IC卡上的應用具有特別重要的意義。
帶寬要求低。當對長消息進行加解密時,三類密碼系統有相同的帶寬要求,但應用于短消息時ECC帶寬要求卻低得多。帶寬要求低使ECC在無線網絡領域具有廣泛的應用前景。
ECC的這些特點使它必將取代RSA,成為通用的公鑰加密算法。比如SET協議的制定者已把它作為下一代SET協議中缺省的公鑰密碼算法。
下面兩張表示是RSA和ECC的安全性和速度的比較。
攻破時間(MIPS年) |
RSA/DSA(密鑰長度) |
ECC密鑰長度 |
RSA/ECC密鑰長度比 |
104 |
512 |
106 |
5:1 |
108 |
768 |
132 |
6:1 |
1011 |
1024 |
160 |
7:1 |
1020 |
2048 |
210 |
10:1 |
1078 |
21000 |
600 |
35:1 |
RSA和ECC安全模長得比較
功能 |
Security Builder 1.2 |
BSAFE 3.0 |
163位ECC(ms) |
1,023位RSA(ms) |
|
密鑰對生成 |
3.8 |
4,708.3 |
簽名 |
2.1(ECNRA) |
228.4 |
3.0(ECDSA) |
||
認證 |
9.9(ECNRA) |
12.7 |
10.7(ECDSA) |
||
Diffie—Hellman密鑰交換 |
7.3 |
1,654.0 |
RSA和ECC速度比較
散列是信息的提煉,通常其長度要比信息小得多,且為一個固定長度。加密性強的散列一定是不可逆的,這就意味著通過散列結果,無法推出任何部分的原始信息。任何輸入信息的變化,哪怕僅一位,都將導致散列結果的明顯變化,這稱之為雪崩效應。散列還應該是防沖突的,即找不出具有相同散列結果的兩條信息。具有這些特性的散列結果就可以用于驗證信息是否被修改。
單向散列函數一般用于產生消息摘要,密鑰加密等,常見的有:
l MD5(Message Digest Algorithm 5):是RSA數據安全公司開發的一種單向散列算法。
l SHA(Secure Hash Algorithm):可以對任意長度的數據運算生成一個160位的數值;
在1993年,安全散列算法(SHA)由美國國家標準和技術協會(NIST)提出,并作為聯邦信息處理標準(FIPS PUB 180)公布;1995年又發布了一個修訂版FIPS PUB 180-1,通常稱之為SHA-1。SHA-1是基于MD4算法的,并且它的設計在很大程度上是模仿MD4的。現在已成為公認的最安全的散列算法之一,并被廣泛使用。
SHA-1是一種數據加密算法,該算法的思想是接收一段明文,然后以一種不可逆的方式將它轉換成一段(通常更小)密文,也可以簡單的理解為取一串輸入碼(稱為預映射或信息),并把它們轉化為長度較短、位數固定的輸出序列即散列值(也稱為信息摘要或信息認證代碼)的過程。
單向散列函數的安全性在于其產生散列值的操作過程具有較強的單向性。如果在輸入序列中嵌入密碼,那么任何人在不知道密碼的情況下都不能產生正確的散列值,從而保證了其安全性。SHA將輸入流按照每塊512位(64個字節)進行分塊,并產生20個字節的被稱為信息認證代碼或信息摘要的輸出。
該算法輸入報文的最大長度不超過264位,產生的輸出是一個160位的報文摘要。輸入是按512 位的分組進行處理的。SHA-1是不可逆的、防沖突,并具有良好的雪崩效應。
通過散列算法可實現數字簽名實現,數字簽名的原理是將要傳送的明文通過一種函數運算(Hash)轉換成報文摘要(不同的明文對應不同的報文摘要),報文摘要加密后與明文一起傳送給接受方,接受方將接受的明文產生新的報文摘要與發送方的發來報文摘要解密比較,比較結果一致表示明文未被改動,如果不一致表示明文已被篡改。
MAC (信息認證代碼)就是一個散列結果,其中部分輸入信息是密碼,只有知道這個密碼的參與者才能再次計算和驗證MAC碼的合法性。MAC的產生參見下圖。
輸入信息 密碼 散列函數 信息認證代碼
因為二者均由MD4導出,SHA-1和MD5彼此很相似。相應的,他們的強度和其他特性也是相似,但還有以下幾點不同:
l 對強行供給的安全性:最顯著和最重要的區別是SHA-1摘要比MD5摘要長32 位。使用強行技術,產生任何一個報文使其摘要等于給定報摘要的難度對MD5是2128數量級的操作,而對SHA-1則是2160數量級的操作。這樣,SHA-1對強行攻擊有更大的強度。
l 對密碼分析的安全性:由于MD5的設計,易受密碼分析的攻擊,SHA-1顯得不易受這樣的攻擊。
l 速度:在相同的硬件上,SHA-1的運行速度比MD5慢。
以上綜述了兩種加密方法的原理,總體來說主要有下面幾個方面的不同:
l 在管理方面:公鑰密碼算法只需要較少的資源就可以實現目的,在密鑰的分配上,兩者之間相差一個指數級別(一個是n一個是n2)。所以私鑰密碼算法不適應廣域網的使用,而且更重要的一點是它不支持數字簽名。
l 在安全方面:由于公鑰密碼算法基于未解決的數學難題,在破解上幾乎不可能。對于私鑰密碼算法,到了AES雖說從理論來說是不可能破解的,但從計算機的發展角度來看。公鑰更具有優越性。
l 從速度上來看:AES的軟件實現速度已經達到了每秒數兆或數十兆比特。是公鑰的100倍,如果用硬件來實現的話這個比值將擴大到1000倍。
前面的章節已經介紹了對稱解密算法和非對稱加密算法,有很多人疑惑:那我們在實際使用的過程中究竟該使用哪一種比較好呢?
我們應該根據自己的使用特點來確定,由于非對稱加密算法的運行速度比對稱加密算法的速度慢很多,當我們需要加密大量的數據時,建議采用對稱加密算法,提高加解密速度。
對稱加密算法不能實現簽名,因此簽名只能非對稱算法。
由于對稱加密算法的密鑰管理是一個復雜的過程,密鑰的管理直接決定著他的安全性,因此當數據量很小時,我們可以考慮采用非對稱加密算法。
在實際的操作過程中,我們通常采用的方式是:采用非對稱加密算法管理對稱算法的密鑰,然后用對稱加密算法加密數據,這樣我們就集成了兩類加密算法的優點,既實現了加密速度快的優點,又實現了安全方便管理密鑰的優點。
如果在選定了加密算法后,那采用多少位的密鑰呢?一般來說,密鑰越長,運行的速度就越慢,應該根據的我們實際需要的安全級別來選擇,一般來說,RSA建議采用1024位的數字,ECC建議采用160位,AES采用128為即可。
隨著密碼學商業應用的普及,公鑰密碼學受到前所未有的重視。除傳統的密碼應用系統外,PKI系統以公鑰密碼技術為主,提供加密、簽名、認證、密鑰管理、分配等功能。
保密通信:保密通信是密碼學產生的動因。使用公私鑰密碼體制進行保密通信時,信息接收者只有知道對應的密鑰才可以解密該信息。
數字簽名:數字簽名技術可以代替傳統的手寫簽名,而且從安全的角度考慮,數字簽名具有很好的防偽造功能。在政府機關、軍事領域、商業領域有廣泛的應用環境。
秘密共享:秘密共享技術是指將一個秘密信息利用密碼技術分拆成n個稱為共享因子的信息,分發給n個成員,只有k(k≤n)個合法成員的共享因子才可以恢復該秘密信息,其中任何一個或m(m≤k)個成員合作都不知道該秘密信息。利用秘密共享技術可以控制任何需要多個人共同控制的秘密信息、命令等。
認證功能:在公開的信道上進行敏感信息的傳輸,采用簽名技術實現對消息的真實性、完整性進行驗證,通過驗證公鑰證書實現對通信主體的身份驗證。
密鑰管理:密鑰是保密系統中更為脆弱而重要的環節,公鑰密碼體制是解決密鑰管理工作的有力工具;利用公鑰密碼體制進行密鑰協商和產生,保密通信雙方不需要事先共享秘密信息;利用公鑰密碼體制進行密鑰分發、保護、密鑰托管、密鑰恢復等。
基于公鑰密碼體制可以實現以上通用功能以外,還可以設計實現以下的系統:安全電子商務系統、電子現金系統、電子選舉系統、電子招投標系統、電子彩票系統等。
公鑰密碼體制的產生是密碼學由傳統的政府、軍事等應用領域走向商用、民用的基礎,同時互聯網、電子商務的發展為密碼學的發展開辟了更為廣闊的前景。
隨著計算方法的改進,計算機運行速度的加快,網絡的發展,越來越多的算法被破解。
在2004年國際密碼學會議(Crypto’2004)上,來自中國山東大學的王小云教授做的破譯MD5、HAVAL-128、MD4和RIPEMD算法的報告,令在場的國際頂尖密碼學專家都為之震驚,意味著這些算法將從應用中淘汰。隨后,SHA-1也被宣告被破解。
歷史上有三次對DES有影響的攻擊實驗。1997年,利用當時各國 7萬臺計算機,歷時96天破解了DES的密鑰。1998年,電子邊境基金會(EFF)用25萬美元制造的專用計算機,用56小時破解了DES的密鑰。1999年,EFF用22小時15分完成了破解工作。因此。曾經有過卓越貢獻的DES也不能滿足我們日益增長的需求了。
最近,一組研究人員成功的把一個512位的整數分解因子,宣告了RSA的破解。
我們說數據的安全是相對的,可以說在一定時期一定條件下是安全的,隨著硬件和網絡的發展,或者是另一個王小云的出現,目前的常用加密算法都有可能在短時間內被破解,那時我們不得不使用更長的密鑰或更加先進的算法,才能保證數據的安全,因此加密算法依然需要不斷發展和完善,提供更高的加密安全強度和運算速度。
縱觀這兩種算法一個從DES到3DES再到AES,一個從RSA到ECC。其發展角度無不是從密鑰的簡單性,成本的低廉性,管理的簡易性,算法的復雜性,保密的安全性以及計算的快速性這幾個方面去考慮。因此,未來算法的發展也必定是從這幾個角度出發的,而且在實際操作中往往把這兩種算法結合起來,也需將來一種集兩種算法優點于一身的新型算法將會出現,到那個時候,電子商務的實現必將更加的快捷和安全。
spring bean 定義可能包含大量的配置信息,包括容器相關的信息(比如初始化方法,靜態工廠方法
等)、構造函數參數、屬性等。如果兩個bean之間的配置信息大同小異,可采用bean的繼承來減少重
復配置工作。子bean定義可以從父bean定義繼承部分配置。它也可覆蓋一些配置,或者添加一些配置
。使用繼承配置可以節省很多輸入工作,實際上就是一種模板形式。
spring中事務配置中就有這樣例子,為了使用事務只要父配置了事務代理就可以了,所有需要事務的
bean只要繼承父就可以了。說到這個就在多說幾句,父bean通常不需要實例化的,而僅僅作為子bean
定的的模板使用;而ApplicationContext默認預初始化所有的singleton bean。為了阻止父bean被預
初始化,可以使用abstract屬性設置父bean為抽象bean。容器會忽略所有的抽象bean定義,預初始化
時不初始化抽象bean。
2, spring 事務管理
傳統的J2EE開發者對事務管理可能采用兩種策略
(1),全局事務:全局事務通常由應用服務器管理,使用JTA。全局事務可跨越多個事務性的資源,保證
在多個事務性資源間跨越時資源一致性。
(2),局部事務:局部事務和特定資源相關,如,一個和JDBC鏈接關聯的事務。該事務盡能保證對該
JDBC連接數據庫的一致性,對局部事務,應用服務器不需要參與事務管理,不能保證跨越多個資源的
事務正確性。
3,編程式事務
Spring 提供兩種編程式的事務管理
(1)使用TransactionTemplate事務管理
(2)直接使用一個PlatformTransactionManager實現類管理事務。
兩種編程式的事務都不需要與特定的事務API耦合,第一種更符合Spring模板式的編程模型,因此通常推薦采用第一種方式,第二種非常類似于JTA的UserTransaction的API編程,區別是減少了異常處理。
4,聲明式事務
Spring的聲明式事務是通過面向切面(AOP)實現。
(1)使用聲明式事務管理
通常,通過TransactionPoxyFactoryBean為目標Bean生成Spring事務代理。當bean實例的方法需要事務管理時,采用TransactionPoxyFactoryBean來自目標bean生成事務代理。每個TransactionPoxyFactoryBean為一個具體的目標bean生成代理對象,代理對象的方法改寫了目標bean的方法,就是在目標bean的方法執行之前加入開始事務,在目標bean方法結束之后提交事務,遇到指定異常回滾事務。
定義事務代理bean模板
(2)根據BeanName自動創建事務代理
如果同一個應用中有很多目標bean需要生成事務代理,當然可以為每個目標bean額外配置一個TransactionPoxyFactoryBean bean.這樣做的缺點是,配置文件相當臃腫而且難以維護,此時可以考慮使用自動事務代理。自動事務代理的思路是,當ApplicationContext初始化完成后,由上下文中的某個bean"后處理"每個目標bean,為這些目標bean生成事務代理。
能為目標bean執行"后處理"的bean必須實現BeanFactoryPostProcessor接口,ApplicationContext完成初始化后,會自動初始化所有實現BeanFactoryPostProcessor接口的bean,并且讓它“后處理”其他bean.Spring提供BeanFactoryPostProcessor的實現類BeanNameAutoPoxyCreator,BeanNameAutoPoxyCreator可以用來處理ApplicationContext中其他bean,方法是通過名稱來識別,并且把他們用事務代理包裝起來。BeanNameAutoPoxyCreator生成的事務代理,和使用TransactionPoxyFactoryBean生成的事務代理基本一致。
定義事務攔截bean
次配置關鍵在兩個bean
TransactionInterceptor
BeanNameAutoProxyCreator
(3)基于注釋式事務代理配置
當采用XML描述配置元數據時,將通過<bean/>元素的class屬性來指定實例化對象的類型。class 屬性 (對應BeanDefinition實例的Class屬性)通常是必須的(不過也有兩種例外的情形,“使用實例工廠方法實例化”和“bean定義的繼承”)。class屬性主要有兩種用途:在大多數情況下,容器將直接通過反射調用指定類的構造器來創建bean(這有點等類似于在Java代碼中使用new操作符);在極少數情況下,容器將調用類的靜態工廠方法來創建bean實例,class屬性將用來指定實際具有靜態工廠方法的類(至于調用靜態工廠方法創建的對象類型是當前class還是其他的class則無關緊要)。
2, 延遲初始化bean
ApplicationContext實現的默認行為就是在啟動時將所有singleton bean提前進行實例化。提前實例化意味著作為初始化過程的一部分,ApplicationContext實例會創建并配置所有的singleton bean。通常情況下這是件好事,因為這樣在配置中的任何錯誤就會即刻被發現(否則的話可能要花幾個小時甚至幾天)。
有時候這種默認處理可能并不是你想要的。如果你不想讓一個singleton bean在ApplicationContext實現在初始化時被提前實例化,那么可以將bean設置為延遲實例化。一個延遲初始化bean將告訴IoC 容器是在啟動時還是在第一次被用到時實例化。
在XML配置文件中,延遲初始化將通過<bean/>元素中的lazy-init屬性來進行控制。例如:
<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true">
<!-- various properties here... -->
</bean>
<bean name="not.lazy" class="com.foo.AnotherBean">
<!-- various properties here... -->
</bean>
當ApplicationContext實現加載上述配置時,設置為lazy的bean將不會在ApplicationContext啟動時提前被實例化,而not.lazy卻會被提前實例化。
需要說明的是,如果一個bean被設置為延遲初始化,而另一個非延遲初始化的singleton bean依賴于它,那么當ApplicationContext提前實例化singleton bean時,它必須也確保所有上述singleton 依賴bean也被預先初始化,當然也包括設置為延遲實例化的bean。因此,如果Ioc容器在啟動的時候創建了那些設置為延遲實例化的bean的實例,你也不要覺得奇怪,因為那些延遲初始化的bean可能在配置的某個地方被注入到了一個非延遲初始化singleton bean里面。
在容器層次中通過在<beans/>元素上使用'default-lazy-init'屬性來控制延遲初始化也是可能的。如下面的配置:
<beans default-lazy-init="true">
<!-- no beans will be eagerly pre-instantiated... -->
</beans>
3,自動裝配(autowire)協作者
Spring IoC容器可以自動裝配(autowire)相互協作bean之間的關聯關系。因此,如果可能的話,可以自動讓Spring通過檢查BeanFactory中的內容,來替我們指定bean的協作者(其他被依賴的bean)。由于autowire可以針對單個bean進行設置,因此可以讓有些bean使用autowire,有些bean不采用。autowire的方便之處在減少或者消除屬性或構造器參數的設置,這樣可以給我們的配置文件減減肥![2] 在xml配置文件中,autowire一共有五種類型,可以在<bean/>元素中使用autowire屬性指定:
Table 3.2. Autowiring modes
模式 說明
no 不使用自動裝配。必須通過ref元素指定依賴,這是默認設置。由于顯式指定協作者可以使配置更靈活、更清晰,因此對于較大的部署配置,推薦采用該設置。而且在某種程度上,它也是系統架構的一種文檔形式。
byName 根據屬性名自動裝配。此選項將檢查容器并根據名字查找與屬性完全一致的bean,并將其與屬性自動裝配。例如,在bean定義中將autowire設置為by name,而該bean包含master屬性(同時提供setMaster(..)方法),Spring就會查找名為master的bean定義,并用它來裝配給master屬性。
byType 如果容器中存在一個與指定屬性類型相同的bean,那么將與該屬性自動裝配。如果存在多個該類型的bean,那么將會拋出異常,并指出不能使用byType方式進行自動裝配。若沒有找到相匹配的bean,則什么事都不發生,屬性也不會被設置。如果你不希望這樣,那么可以通過設置dependency-check="objects"讓Spring拋出異常。
constructor 與byType的方式類似,不同之處在于它應用于構造器參數。如果在容器中沒有找到與構造器參數類型一致的bean,那么將會拋出異常。
autodetect 通過bean類的自省機制(introspection)來決定是使用constructor還是byType方式進行自動裝配。如果發現默認的構造器,那么將使用byType方式。
如果直接使用property和constructor-arg注入依賴的話,那么將總是覆蓋自動裝配。而且目前也不支持簡單類型的自動裝配,這里所說的簡單類型包括基本類型、String、Class以及簡單類型的數組(這一點已經被設計,將考慮作為一個功能提供)。自動裝配還可以與依賴檢查結合使用,這樣依賴檢查將在自動裝配完成之后被執行。
理解自動裝配的優缺點是很重要的。其中優點包括:
自動裝配能顯著減少配置的數量。不過,采用bean模板(見這里)也可以達到同樣的目的。
自動裝配可以使配置與java代碼同步更新。例如,如果你需要給一個java類增加一個依賴,那么該依賴將被自動實現而不需要修改配置。因此強烈推薦在開發過程中采用自動裝配,而在系統趨于穩定的時候改為顯式裝配的方式。
自動裝配的一些缺點:
盡管自動裝配比顯式裝配更神奇,但是,正如上面所提到的,Spring會盡量避免在裝配不明確的時候進行猜測,因為裝配不明確可能出現難以預料的結果,而且Spring所管理的對象之間的關聯關系也不再能清晰的進行文檔化。
對于那些根據Spring配置文件生成文檔的工具來說,自動裝配將會使這些工具沒法生成依賴信息。
如果采用by type方式自動裝配,那么容器中類型與自動裝配bean的屬性或者構造函數參數類型一致的bean只能有一個,如果配置可能存在多個這樣的bean,那么就要考慮采用顯式裝配了。
盡管使用autowire沒有對錯之分,但是能在一個項目中保持一定程度的一致性是最好的做法。例如,通常情況下如果沒有使用自動裝配,那么僅自動裝配一個或兩個bean定義可能會引起開發者的混淆。
Ehcache支持的分布式緩存支持有三種RMI,JGroups,JMS
這里介紹下MRI和JGrpups兩種方式,Ehcache使用版本為1.5.0,關于ehcache的其他信息請參考http://ehcache.sourceforge.net/EhcacheUserGuide.html,關于jgroups的信息請參考http://www.jgroups.org/manual/html_single/index.html。
原始文章 http://www.javaeye.com/topic/335623
它是一種可以接收從internet 或者internet 上的其他系統傳遞過來的請求的輕量級獨立的通信技術。這種技術允許網絡上的所有系統進行交互。
j2ee平臺是圍繞web服務來構架的,其中的技術和web服務相關的有JAX-RCP 、Web Service、SAAJ 、JAXR 、EJB 、JAC 等,其中Web Services for J2EE 是WEB服務總框架,JAX-RCP是J2EE的WEB服務的核心技術,SAAJ為處理帶附件的SOAP消息提供了JAVA編程API.
在J2EE平臺中,要開發WEB服務可以使用兩種技術,一種基于XML遠程調用的技術-JAX-RCP,另外一個基于XML的消息發送技術-JAXM.
這里主要針對JAX-RCP 詳細說一下。
JAX-RCP( JAVA API FOR XMLBASED RCP) 是一種遠程方法調用(或者說遠程過程調用),那么它和其他遠程方法調用(RPC,COM,CORBA RMI)有什么區別呢
綜合比較長遠的遠程方法調用技術,他們有以下共性。
1,在客戶端和服務端有通用的編程接口。
2,在客戶端STUB,在服務端有SKELETON.
3,客戶端和服務端有專門的協議進行數據傳輸。
對于通用接口的描述,比如CORBA 有IDL OF CORBA ,JAVA RMI 有JAVA RMI INTERFACE IN RMI ,對于基于XML的RPC 來說,IDL 就是WSDL。那么對于XML-RPC來說,這個結構中“傳輸協議”當然是SAOP,SOAP消息是將以傳輸文本為基礎的協議(HTTP,SMTP FTP)作為載體來使用的。也就是說,SOAP消息的傳輸建立在HTTP SMTP FTP之上。
JAX-RCP的客戶端調用方法:
1,基于STUB
2,動態代理
3,動態調用