WebLogic配置文件Config.xml中的{3DES}加密字符串的解密思路
Posted on 2006-09-07 12:35 在路上... 閱讀(8547) 評論(1) 編輯 收藏 所屬分類: JAVA相關
通常在weblogic的config.xml文件中,對于關鍵字符串、密碼會自動加密,例如LDAP密碼、數據庫JDBC連接池連接密碼等。通常加密之后前面會加上{3DES}的標識。
3DES就是DES算法的增強,相關資料如下:
1、DES(Data Encryption Standard)是一種經典的對稱算法。其數據分組長度為64位,使用的密鑰為64位,有效密鑰長度為56位(有8位用于奇偶校驗)。它由IBM公司在70年代開發,經過政府的加密標準篩選后,于1976年11月被美國政府采用,隨后被美國國家標準局和美國國家標準協會(American National Standard Institute, ANSI) 承認。
該技術算法公開,在各行業有著廣泛的應用。DES算法從公布到現在已有20多年的歷史,由于計算機能力的飛速發展,DES的56位密鑰長度顯得有些太短了,已經有可能通過窮舉的
方法來對其進行攻擊。但是除此以外,直到現在還沒有發現窮舉以外的能有效破譯DES的方法。
2、DES算法現在已經不能提供足夠的安全性,因為其有效密鑰只有56位。因此,后來又提出了三重DES(或稱3DES),該方法的強度大約和112比特的密鑰強度相當。
這種方法用兩個密鑰對明文進行三次運算。設兩個密鑰是K1和K2,其算法的步驟如圖3所示:
1. 用密鑰K1進行DES加密。
2. 用K2對步驟1的結果進行DES解密。
3. 用步驟2的結果使用密鑰K1進行DES加密。
首先需要找到加密的密鑰,根據BEA文檔可以發現是文件SerializedSystemIni.dat,查找一下安裝目錄就可以找到整個問見,通常系統管理員應該將該文件設置為不能直接訪問,以提高安全性。
加密、解密的大致演示算法代碼如下,在WebLogic 9.2下面調試通過,運行編譯前應該先運行setExamplesEnv.cmd(參考)的環境變量,以保證相關類庫已經被引用了。對于低版本的WebLogic,例如WebLogic 7.0/8.1可能不能直接在命令行執行,因為SerializedSystemIni必須在控制臺Console環境下面才能調用,有興趣的朋友可以自行測試看看。
測試運行結果如下:
root@srdsh?#?/rdsh/bea92/jdk150_04/bin/java?CrackData?decrypt?nMttUc5jNe9RNJXslXjbJQ==
-86,123,19,107,
-42,-28,-75,-100,31,0,25,-93,75,115,40,-3,-15,42,-53,41,-25,-13,-6,8,36,85,-81,2
8,66,-110,31,38,-29,-79,-44,-48,
weblogic.security.internal.encryption.JSafeEncryptionServiceImpl@199f91c
3DES
Decode:weblogic
root@srdsh?#?/rdsh/bea92/jdk150_04/bin/java?CrackData?decrypt?erzD515N5z2zSnOk7uG1cYQthCbYA5OU6Bw+Zt5BsjPruTQaOZASh+ZZW4kuBGvfbZ2BXWSACbgOZ2MY4bHtpOPps/6WfZJg
-86,123,19,107,
-42,-28,-75,-100,31,0,25,-93,75,115,40,-3,-15,42,-53,41,-25,-13,-6,8,36,85,-81,2
8,66,-110,31,38,-29,-79,-44,-48,
weblogic.security.internal.encryption.JSafeEncryptionServiceImpl@199f91c
3DES
Decode:0xa778f572127d2282247ec653147c35d4e4040aca016c6d1e06ab325af5798fca
root@srdsh?#
3DES就是DES算法的增強,相關資料如下:
1、DES(Data Encryption Standard)是一種經典的對稱算法。其數據分組長度為64位,使用的密鑰為64位,有效密鑰長度為56位(有8位用于奇偶校驗)。它由IBM公司在70年代開發,經過政府的加密標準篩選后,于1976年11月被美國政府采用,隨后被美國國家標準局和美國國家標準協會(American National Standard Institute, ANSI) 承認。
該技術算法公開,在各行業有著廣泛的應用。DES算法從公布到現在已有20多年的歷史,由于計算機能力的飛速發展,DES的56位密鑰長度顯得有些太短了,已經有可能通過窮舉的
方法來對其進行攻擊。但是除此以外,直到現在還沒有發現窮舉以外的能有效破譯DES的方法。
2、DES算法現在已經不能提供足夠的安全性,因為其有效密鑰只有56位。因此,后來又提出了三重DES(或稱3DES),該方法的強度大約和112比特的密鑰強度相當。
這種方法用兩個密鑰對明文進行三次運算。設兩個密鑰是K1和K2,其算法的步驟如圖3所示:
1. 用密鑰K1進行DES加密。
2. 用K2對步驟1的結果進行DES解密。
3. 用步驟2的結果使用密鑰K1進行DES加密。
首先需要找到加密的密鑰,根據BEA文檔可以發現是文件SerializedSystemIni.dat,查找一下安裝目錄就可以找到整個問見,通常系統管理員應該將該文件設置為不能直接訪問,以提高安全性。
加密、解密的大致演示算法代碼如下,在WebLogic 9.2下面調試通過,運行編譯前應該先運行setExamplesEnv.cmd(參考)的環境變量,以保證相關類庫已經被引用了。對于低版本的WebLogic,例如WebLogic 7.0/8.1可能不能直接在命令行執行,因為SerializedSystemIni必須在控制臺Console環境下面才能調用,有興趣的朋友可以自行測試看看。
?1
import?weblogic.security.internal.*;
?2
import?weblogic.security.internal.encryption.EncryptionService;
?3
import?weblogic.utils.encoders.BASE64Decoder;
?4
import?weblogic.utils.encoders.BASE64Encoder;
?5
public?class?CrackData?
?6

{
?7
????public?static?void?main(String[]?args)?
?8
????
{
?9
????????byte[]?salt,keys;
10
????????salt=SerializedSystemIni.getSalt();
11
????????keys=SerializedSystemIni.getEncryptedSecretKey();
12
????????String?data="";
13
????????for(int?i=0;i<salt.length;i++)
{
14
????????????data+=salt[i]+",";
15
????????}
16
????????System.out.println("salt:"+data);
17
????????data="";
18
????????for(int?i=0;i<keys.length;i++)
{
19
????????????data+=keys[i]+",";
20
????????}
21
????????System.out.println("Key:"+data);
22
????????//EncryptionService?svr=SerializedSystemIni.getExistingEncryptionService();
23
????????EncryptionService?svr=SerializedSystemIni.getEncryptionService();
24
????????System.out.println(svr);
25
????????System.out.println(svr.getAlgorithm());
26
????????if(args.length>1)
{
27
????????????if(args[0].equals("encrypt"))
{
28
????????????????byte[]?edata=svr.encryptString(args[1]);
29
????????????????String?s?=?(new?BASE64Encoder()).encodeBuffer(edata);
30
????????????????System.out.println("Encode:"+s);
31
????????????}
32
????????????if(args[0].equals("decrypt"))
{
33
????????????????try
{
34
????????????????byte[]?edata?=?(new?BASE64Decoder()).decodeBuffer(args[1]);
35
????????????????String?txt=svr.decryptString(edata);
36
????????????????System.out.println("Decode:"+txt);
37
????????????????}catch(Exception?ex)
{
38
????????????????????ex.printStackTrace();
39
????????????????}
40
????????????}
41
????????}
42
????????
43
????}
44
}
45

?2

?3

?4

?5

?6



?7

?8



?9

10

11

12

13



14

15

16

17

18



19

20

21

22

23

24

25

26



27



28

29

30

31

32



33



34

35

36

37



38

39

40

41

42

43

44

45

測試運行結果如下:














