Jive筆記3----Jive2.1.1 License保護原理分析 (轉)
Jive筆記3----Jive2.1.1 License保護原理分析 (轉)[@more@]從Jive2.0開始,需要購買License才能夠將Jive用於商業應用。
現在簡單分析一下Jive2中的License驗證的實現。
要訪問論壇,必然要用到ForumFactory.getInstance(authorization)。J
ive就是在這個中進行了License驗證。看看Jive_2_1_1版本中對應的程式碼:
ForumFactory getInstance(Authorization authorization)
{
...
// Note, the software license expressely forbids
// tampering with this check.
LicenseManager.validateLicense("Jive Forums Basic", "2.0");
//如果驗證失敗,LicenseManager會丟擲一個LicenseException
...
}
所以,如果希望使用版本的Jive,我們只要簡單的遮蔽掉上面的語句就可以了。可是,看看上面註釋,如果你是君子,就不該改動這個。我當然不願意隨隨便便做小人,所以要是能搞一個序號產生器什麼的大批次生產Enterprise級別的Jive License就爽啦。
接下來研究License究竟是什麼回事情。
首先從jivesoftware.com上一個試用版本的jive.license。開啟一看,一堆資料:
D94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxsaWNlbnNlP
................
MzEwMjRmY2EzNGRlYTFkOGMwNWFhOGFhMWIxYTk4MDRiZGEyM2E1PC9zaWduYXR1cmU+PC9saWNlbnNlPg0K
看起來是base64過的,所以還是看程式碼先。
ok,研究LicenseManager這個類。可是找遍了Jive2_1_1source,就是沒有找到。原來Jivesoftware沒有提供Source,只好找到對應的Class反編譯。
反編譯得到兩個類LicenseManager.和License.java。
透過分析發現,LicenseManager.validateLicense()中了函式loadLicense()來載入License檔案。
在loadLicense()中找到了下面的程式碼:
String s1 = StringUtils.decodeBase64(stringbuffer.toString());
license = License.from(s1);
由此確定java.license是經過base64編碼的xml檔案。同時封裝到了License類中
的License內容如下:
3
Jive Forums Basic
Evaluation
2.1
1
2001/11/01
2001/10/13
302d02145a27545abb3c89bbc34a3900476dfd3fd9495047021500831024fca34dea1d8c05aa8aa1b1a9804bda23a5
似乎我們只要修改 中的內容就能獲得Commercial License了。
真的這麼簡單?繼續看下去。
經過分析LicenseManager.validate(license),發現JiveSoft使用了DSA數字簽名演算法確保License不被修改。fAINT...
static boolean validate(License license1)
throws Exception
{
//生成公鑰
String s = "308201b......d06d854a";
byte abyte0[] = StringUtils.decodeHex(s);
X509EncodedKeySpec x509encodedkeyspec = new X509EncodedKeySpec(abyte0);
KeyFactory keyfactory = KeyFactory.getInstance("DSA");
java.security.PublicKey publickey = keyfactory.generatePublic(x509encodedkeyspec);
Signature signature = Signature.getInstance("DSA");
signature.initVerify(publickey);
//指紋,也就是License中的所有內容(除了最後的signature)。
signature.update(license1.getFingerprint());
//進行校驗,如果內容被改動,則返回false;
return signature.verify(StringUtils.decodeHex(license1.getSignature()));
}
由此可見,JiveSoftware透過DSA演算法生成鑰匙對,用私鑰簽署License,生成signagure,隨同jive.license發放。並同時在程式中儲存鑰匙對中的公鑰,利用Java.Security.*中的進行驗證。如果要自己造License,必須得到那個私鑰,這一般不大可能實現。
得出結論:搞不定,不過做個小人也不錯,Let's it!
注:我對於DSA演算法不是十分清楚,有些地方似乎妄下斷言了。若有牛人看到,請不吝指正!
現在簡單分析一下Jive2中的License驗證的實現。
要訪問論壇,必然要用到ForumFactory.getInstance(authorization)。J
ive就是在這個中進行了License驗證。看看Jive_2_1_1版本中對應的程式碼:
ForumFactory getInstance(Authorization authorization)
{
...
// Note, the software license expressely forbids
// tampering with this check.
LicenseManager.validateLicense("Jive Forums Basic", "2.0");
//如果驗證失敗,LicenseManager會丟擲一個LicenseException
...
}
所以,如果希望使用版本的Jive,我們只要簡單的遮蔽掉上面的語句就可以了。可是,看看上面註釋,如果你是君子,就不該改動這個。我當然不願意隨隨便便做小人,所以要是能搞一個序號產生器什麼的大批次生產Enterprise級別的Jive License就爽啦。
接下來研究License究竟是什麼回事情。
首先從jivesoftware.com上一個試用版本的jive.license。開啟一看,一堆資料:
D94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxsaWNlbnNlP
................
MzEwMjRmY2EzNGRlYTFkOGMwNWFhOGFhMWIxYTk4MDRiZGEyM2E1PC9zaWduYXR1cmU+PC9saWNlbnNlPg0K
看起來是base64過的,所以還是看程式碼先。
ok,研究LicenseManager這個類。可是找遍了Jive2_1_1source,就是沒有找到。原來Jivesoftware沒有提供Source,只好找到對應的Class反編譯。
反編譯得到兩個類LicenseManager.和License.java。
透過分析發現,LicenseManager.validateLicense()中了函式loadLicense()來載入License檔案。
在loadLicense()中找到了下面的程式碼:
String s1 = StringUtils.decodeBase64(stringbuffer.toString());
license = License.from(s1);
由此確定java.license是經過base64編碼的xml檔案。同時封裝到了License類中
的License內容如下:
似乎我們只要修改
真的這麼簡單?繼續看下去。
經過分析LicenseManager.validate(license),發現JiveSoft使用了DSA數字簽名演算法確保License不被修改。fAINT...
static boolean validate(License license1)
throws Exception
{
//生成公鑰
String s = "308201b......d06d854a";
byte abyte0[] = StringUtils.decodeHex(s);
X509EncodedKeySpec x509encodedkeyspec = new X509EncodedKeySpec(abyte0);
KeyFactory keyfactory = KeyFactory.getInstance("DSA");
java.security.PublicKey publickey = keyfactory.generatePublic(x509encodedkeyspec);
Signature signature = Signature.getInstance("DSA");
signature.initVerify(publickey);
//指紋,也就是License中的所有內容(除了最後的signature)。
signature.update(license1.getFingerprint());
//進行校驗,如果內容被改動,則返回false;
return signature.verify(StringUtils.decodeHex(license1.getSignature()));
}
由此可見,JiveSoftware透過DSA演算法生成鑰匙對,用私鑰簽署License,生成signagure,隨同jive.license發放。並同時在程式中儲存鑰匙對中的公鑰,利用Java.Security.*中的進行驗證。如果要自己造License,必須得到那個私鑰,這一般不大可能實現。
得出結論:搞不定,不過做個小人也不錯,Let's it!
注:我對於DSA演算法不是十分清楚,有些地方似乎妄下斷言了。若有牛人看到,請不吝指正!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-958261/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 過載保護原理與實戰
- 微服務過載保護原理與實戰微服務
- Asp-Net-Core開發筆記:給SwaggerUI加上登入保護功能筆記SwaggerUI
- Spring---IoC(控制反轉)原理學習筆記【全】Spring筆記
- 讀所羅門的密碼筆記14_資料隱私保護密碼筆記
- 區塊鏈資料隱私保護分析區塊鏈
- 玩轉Koa -- 核心原理分析
- class-dump 混淆加固、保護與最佳化原理
- EOCR-SE2電動機保護器失速與堵轉保護功能的使用方法
- 24-工控安全需求分析與安全保護工程
- 雙指標維護筆記指標筆記
- 保護模式模式
- 保護期限
- 【影像處理筆記】SIFT演算法原理與原始碼分析筆記演算法原始碼
- 固態硬碟掉電保護的原理及測試方法硬碟
- 分析及防護:Win10執行流保護繞過問題Win10
- AQS原理學習筆記AQS筆記
- KVO與KVC原理筆記筆記
- Vuex 原理淺析筆記Vue筆記
- synchronized原理學習筆記synchronized筆記
- [轉帖]JDK/Java 17 GA,新增「Free Java License」JDKJava
- Spring Cloud Eureka原理分析(二):續租、下線、自我保護機制和自動清理(服務端)SpringCloud服務端
- 【等級保護】等級保護共分為幾級?保護物件是指什麼?物件
- 【iOS開發】iOS App的加固保護原理:使用ipaguard混淆加固iOSAPP
- gitlab分支保護Gitlab
- charles license
- 容斥原理學習筆記筆記
- 編譯原理讀書筆記編譯原理筆記
- 26-大資料安全需求分析與安全保護工程大資料
- 學習筆記(21):C++語言基礎視訊教程-3.9 用const實施保護筆記C++
- Linux核心記憶體保護機制:aslr和canaryLinux記憶體
- Qt Creator 原始碼學習筆記04,多外掛實現原理分析QT原始碼筆記
- Laravel 中 “記住我” 原理分析Laravel
- 【筆記】線段維護單調棧筆記
- 精密進近復飛轉彎保護區的繪製(三)
- FutureTask原始碼分析筆記原始碼筆記
- 原始碼分析筆記——OkHttp原始碼筆記HTTP
- 資料庫保護資料庫
- 敏感資訊保護