Jive筆記3----Jive2.1.1 License保護原理分析 (轉)

amyz發表於2007-08-15
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演算法不是十分清楚,有些地方似乎妄下斷言了。若有牛人看到,請不吝指正!

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-958261/,如需轉載,請註明出處,否則將追究法律責任。

相關文章