WebLogic配置文件Config.xml中的{3DES}加密字符串的解密思路
Posted on 2006-09-07 12:35 在路上... 閱讀(8534) 評論(1) 編輯 收藏 所屬分類: JAVA相關(guān)
通常在weblogic的config.xml文件中,對于關(guān)鍵字符串、密碼會自動加密,例如LDAP密碼、數(shù)據(jù)庫JDBC連接池連接密碼等。通常加密之后前面會加上{3DES}的標(biāo)識。
3DES就是DES算法的增強(qiáng),相關(guān)資料如下:
1、DES(Data Encryption Standard)是一種經(jīng)典的對稱算法。其數(shù)據(jù)分組長度為64位,使用的密鑰為64位,有效密鑰長度為56位(有8位用于奇偶校驗)。它由IBM公司在70年代開發(fā),經(jīng)過政府的加密標(biāo)準(zhǔn)篩選后,于1976年11月被美國政府采用,隨后被美國國家標(biāo)準(zhǔn)局和美國國家標(biāo)準(zhǔn)協(xié)會(American National Standard Institute, ANSI) 承認(rèn)。
該技術(shù)算法公開,在各行業(yè)有著廣泛的應(yīng)用。DES算法從公布到現(xiàn)在已有20多年的歷史,由于計算機(jī)能力的飛速發(fā)展,DES的56位密鑰長度顯得有些太短了,已經(jīng)有可能通過窮舉的
方法來對其進(jìn)行攻擊。但是除此以外,直到現(xiàn)在還沒有發(fā)現(xiàn)窮舉以外的能有效破譯DES的方法。
2、DES算法現(xiàn)在已經(jīng)不能提供足夠的安全性,因為其有效密鑰只有56位。因此,后來又提出了三重DES(或稱3DES),該方法的強(qiáng)度大約和112比特的密鑰強(qiáng)度相當(dāng)。
這種方法用兩個密鑰對明文進(jìn)行三次運(yùn)算。設(shè)兩個密鑰是K1和K2,其算法的步驟如圖3所示:
1. 用密鑰K1進(jìn)行DES加密。
2. 用K2對步驟1的結(jié)果進(jìn)行DES解密。
3. 用步驟2的結(jié)果使用密鑰K1進(jìn)行DES加密。
首先需要找到加密的密鑰,根據(jù)BEA文檔可以發(fā)現(xiàn)是文件SerializedSystemIni.dat,查找一下安裝目錄就可以找到整個問見,通常系統(tǒng)管理員應(yīng)該將該文件設(shè)置為不能直接訪問,以提高安全性。
加密、解密的大致演示算法代碼如下,在WebLogic 9.2下面調(diào)試通過,運(yùn)行編譯前應(yīng)該先運(yùn)行setExamplesEnv.cmd(參考)的環(huán)境變量,以保證相關(guān)類庫已經(jīng)被引用了。對于低版本的WebLogic,例如WebLogic 7.0/8.1可能不能直接在命令行執(zhí)行,因為SerializedSystemIni必須在控制臺Console環(huán)境下面才能調(diào)用,有興趣的朋友可以自行測試看看。
測試運(yùn)行結(jié)果如下:
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算法的增強(qiáng),相關(guān)資料如下:
1、DES(Data Encryption Standard)是一種經(jīng)典的對稱算法。其數(shù)據(jù)分組長度為64位,使用的密鑰為64位,有效密鑰長度為56位(有8位用于奇偶校驗)。它由IBM公司在70年代開發(fā),經(jīng)過政府的加密標(biāo)準(zhǔn)篩選后,于1976年11月被美國政府采用,隨后被美國國家標(biāo)準(zhǔn)局和美國國家標(biāo)準(zhǔn)協(xié)會(American National Standard Institute, ANSI) 承認(rèn)。
該技術(shù)算法公開,在各行業(yè)有著廣泛的應(yīng)用。DES算法從公布到現(xiàn)在已有20多年的歷史,由于計算機(jī)能力的飛速發(fā)展,DES的56位密鑰長度顯得有些太短了,已經(jīng)有可能通過窮舉的
方法來對其進(jìn)行攻擊。但是除此以外,直到現(xiàn)在還沒有發(fā)現(xiàn)窮舉以外的能有效破譯DES的方法。
2、DES算法現(xiàn)在已經(jīng)不能提供足夠的安全性,因為其有效密鑰只有56位。因此,后來又提出了三重DES(或稱3DES),該方法的強(qiáng)度大約和112比特的密鑰強(qiáng)度相當(dāng)。
這種方法用兩個密鑰對明文進(jìn)行三次運(yùn)算。設(shè)兩個密鑰是K1和K2,其算法的步驟如圖3所示:
1. 用密鑰K1進(jìn)行DES加密。
2. 用K2對步驟1的結(jié)果進(jìn)行DES解密。
3. 用步驟2的結(jié)果使用密鑰K1進(jìn)行DES加密。
首先需要找到加密的密鑰,根據(jù)BEA文檔可以發(fā)現(xiàn)是文件SerializedSystemIni.dat,查找一下安裝目錄就可以找到整個問見,通常系統(tǒng)管理員應(yīng)該將該文件設(shè)置為不能直接訪問,以提高安全性。
加密、解密的大致演示算法代碼如下,在WebLogic 9.2下面調(diào)試通過,運(yùn)行編譯前應(yīng)該先運(yùn)行setExamplesEnv.cmd(參考)的環(huán)境變量,以保證相關(guān)類庫已經(jīng)被引用了。對于低版本的WebLogic,例如WebLogic 7.0/8.1可能不能直接在命令行執(zhí)行,因為SerializedSystemIni必須在控制臺Console環(huán)境下面才能調(diào)用,有興趣的朋友可以自行測試看看。
?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

測試運(yùn)行結(jié)果如下:














