乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      java加密和licence控制的設計

       duduwolf 2005-07-20
       

      1.版權(quán)聲明

          本文是關(guān)于如何通過序列號來加載加密的class文件的闡述。
         本文所提及的Resin hessian是Caucho公司的注冊產(chǎn)品名稱, 其版權(quán)規(guī)caucho所有。
      本文可以轉(zhuǎn)載, 但是必須注明作者的Blog地址:

      2. 本文的適用對象

          作為技術(shù)人員,本文的技術(shù)細節(jié)涉及到Java語言的基礎知識, 您在閱讀前應該了解Java動態(tài)裝載Class的機制,以及常規(guī)的Java加密的相關(guān)知識, 同時本文假定您已經(jīng)具有開發(fā)web的基本能力, 了解jsp和servlet的運作過程。

      3.怎樣閱讀

      你可以在下面地址下載到本文所用到的Jar文件和加密工具
      加密工具的下載:
      關(guān)于序列號的生成部分, 鑒于保護公司產(chǎn)品的考慮就不再公開發(fā)布了, 有興趣的同仁可以用mail和我交流。
       
       

      4. 概述

      4.1. 加密Java源碼的原因

        Java源代碼經(jīng)過編譯以后在JVM中執(zhí)行。由于JVM界面是完全透明的,Java類文件能夠很容易通過反編譯器重新轉(zhuǎn)換成源代碼。因此,所有的算法、類文件等都可以以源代碼的形式被公開,使得軟件不能受到保護,為了保護產(chǎn)權(quán),一般可以有以下幾種方法:
       
       ?。?)"模糊"類文件,把文件的名稱和方法換成000OOoo的方式,當然只要你有足夠的耐心, 將這些編碼轉(zhuǎn)換成自己可以看懂的代碼, 并非難事。
       
       ?。?)流行的加密工具對源文件進行加密,比如PGP(Pretty Good Privacy)或GPG(GNU Privacy Guard)。這時,最終用戶在運行應用之前必須先進行解密。但解密之后,最終用戶就有了一份不加密的類文件,這和事先不進行加密沒有什么差別。
       
        (3)加密類文件,在運行中JVM用定制的類裝載器(Class Loader)解密類文件。Java運行時裝入字節(jié)碼的機制隱含地意味著可以對字節(jié)碼進行修改。JVM每次裝入類文件時都需要一個稱為ClassLoader的對象,這個對象負責把新的類裝入正在運行的JVM。JVM給ClassLoader一個包含了待裝入類(例如java.lang.Object)名字的字符串,然后由ClassLoader負責找到類文件,裝入原始數(shù)據(jù),并把它轉(zhuǎn)換成一個Class對象。
       
        用戶下載的是加密過的類文件,在加密類文件裝入之時進行解密,因此可以看成是一種即時解密器。由于解密后的字節(jié)碼文件永遠不會保存到文件系統(tǒng),所以竊密者很難得到解密后的代碼。
       
        由于把原始字節(jié)碼轉(zhuǎn)換成Class對象的過程完全由系統(tǒng)負責,所以創(chuàng)建定制ClassLoader對象其實并不困難,只需先獲得原始數(shù)據(jù),接著就可以進行包含解密在內(nèi)的任何轉(zhuǎn)換。
       

      4.2. Java密碼體系和Java密碼擴展

       
        Java密碼體系(JCA)和Java密碼擴展(JCE)的設計目的是為Java提供與實現(xiàn)無關(guān)的加密函數(shù)API。它們都用factory方法來創(chuàng)建類的例程,然后把實際的加密函數(shù)委托給提供者指定的底層引擎,引擎中為類提供了服務提供者接口在Java中實現(xiàn)數(shù)據(jù)的加密/解密,是使用其內(nèi)置的JCE(Java加密擴展)來實現(xiàn)的。Java密碼體系結(jié)構(gòu)支持供應商的互操作,同時支持硬件和軟件實現(xiàn)。

      4.3. 本文采用的方式

      我們采用的是第三種方式, 將class文件加密作為產(chǎn)品的發(fā)行版本,但是為了讓這個加密的方式可以在不同的項目里面使用, 又將這個解密的處理做成webservice的方式來進行.

      5. 基本設計思想

      這個過程可以劃分成5個部分:

      1)      將加密的class文件傳遞到webService里面.
      2)      由webService來查看Licence是里面, 是否有合法的信息, 譬如產(chǎn)品名稱, 版本, 授權(quán)用戶,已經(jīng)過期時間等, 有此決定是否繼續(xù)執(zhí)行第3個步驟
      3)      如果一切驗證通過, 將由webService返回一個解密的文件
      4)      由本地的webService來裝載這個class對象,
      5)      構(gòu)造成一個class的instance
       
       
       

      6.那個文件應該被加密

         在以前, 嘗試將自己的API進行加密, 但是作為API本身在公司內(nèi)部發(fā)行, 這就要求我們每個programmer在編寫代碼的時候必須人手一個Licence才可以進行正常的工作, 為API的升級和維護也帶來極大的不便, 為什么? 因為API不能作為一個Jar發(fā)布, 只能以class的方式來發(fā)布.
         那么. 我們應該加密的是什么呢? 在我們設計web程序的時候, 一般的流程是, login 然后在session或cookie里面記錄他的身份信息, 譬如她是一個什么樣的用戶, 是學生或者教師還是管理員, 同時, 我們要記錄他具有什么權(quán)限, 每個權(quán)限的操作范圍又是什么? 那么這個過程我們一般在用戶登陸, 和數(shù)據(jù)庫連接之后來進行的, 這是一個復雜的邏輯操作過程,, 加密這個方法是一個好的想法, 這樣惡意的用戶, 即使把所有的其他class文件用jad來還原, 也無濟于事, 除非他可以猜出你在login的時候到底做了什么。
       

      7. 怎樣加密自己的java文件

      7.2.  文件的加密

         加密我們的文件, 我們采用的是JCE的算法來進行的, 具體的加密實現(xiàn), 我再次不再敘述, 在google里面, 你可以獲取n多的文章在描述這個JCE的用法, 對于我們的文件, 已經(jīng)提供了一個windows的exe程序來之行,這個文件叫做encryption.exe
      你可以用如下命令來加密自己的文件

      c:> encryption –encrypto myClass.class

       
      這樣就可以把你的文件做成Jad等工具無法反編譯的文件了。
       

      8. 從LicenceCenter獲取的產(chǎn)品信息

      無論再添加課程還是, 建立新的用戶的時候, 您都可能會有一個需求, 我怎么知道自己的產(chǎn)品授權(quán)給這個用戶什么樣的信息呢, 是否允許他再建立一個課程或者添加一個客戶?
       
      我們提供的jar里面可以解決你的困惑:
      代碼如下
       

      LicenceFactory licenceFactory=new LicenceFactory();
              licenceFactory.getLicence("urProductName");
       

      如果這個產(chǎn)品在驗證中心沒有注冊序列號, 將返回null;
       

      9.程序需要增加什么配置

      在licenceClient里面, 系統(tǒng)需要讀取licenceCenter的地址, 在您的web應用發(fā)布的時候, 必須將webService的地址編寫成環(huán)境變量, 在web.xml里面增加一段代碼:

      <env-entry>
                    <env-entry-name>licence_service_url</env-entry-name>
                          <env-entry-value>http://192.168.2.212:8080/licenceCenter/LicenceService</env-entry-value>
                    <env-entry-type>java.lang.String</env-entry-type>
             </env-entry>

       
      你可以將紅色的部分放在你的web server上訪問, 假設看到如下界面, 表示驗證中心已經(jīng)安裝成功

      10.關(guān)于驗證中心的安裝

      驗證中心的安裝文件為 licenceService1.0.1.zip
      在你的操作系統(tǒng)里面解壓在一個目錄中。
      在你的Java web server里面配置一個應用, 譬如叫做:licenceCenter
      以Resin為例子:在httpd.conf里面加上一下代碼:

      <web-app id="demo" app-dir="E:/licencescenter/webapp">
                                  <servlet-mapping url-pattern=‘*.jsp‘
                                         servlet-name=‘com.caucho.jsp.JspServlet‘/>       
       
      </web-app>

       
      其中在你的這個應用中的web.xml文件必須包含

      <servlet servlet-name="LicenceService"      servlet-class="com.caucho.hessian.server.HessianServlet">
          <init-param service-class="com.collegesoft.licence.LicenceService"/>
          <init-param api-class="com.collegesoft.licence.LicenceServiceStub"/>
        </servlet>
        <servlet-mapping url-pattern="/LicenceService" servlet-name="LicenceService"/>

       

      11. 常見問題

      Q: 為什么不直接在webService里面加載好一個Class, 而是要在客戶端來用classLoader來裝載?
      A: 很多的程序員問過我這個問題,其實很簡單, 你如果知道classloader的機制, 就知道假設你擴展login的實例用到你的另外一個對象, 譬如OnlineUser, 那么要在webService里面來裝載你的類, 我就必須擁有你這個類, 但是webservice里面是不知道你未來是要用到什么類的。
      Q:為什么在redhat9上,訪問驗證中心會出現(xiàn)中文亂碼問題?
      A:是由于redhat9的默認字符集不為GBK的緣故。一般采用將命令export LANG=zh_CN.GBK加在resin服務啟動文件中。
       

      13.關(guān)于作者

      OldJavaMan, 是一個Java的狂熱分子, 喜歡OpenSouce的東西, 無奈自己還要靠這個東西養(yǎng)家, 無法實現(xiàn)開源的做法, 期望有一天可以衣食無憂地編寫自己喜歡地程序, 并從中獲取自己的人生樂趣。

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多