真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java代碼安全性注意 java 代碼安全

JAVA開發(fā)過程中需要注意那些問題?

開發(fā)過程需要注意的問題有下面這些:\x0d\x0a\x0d\x0a1. 服務(wù)器端必須提供輸入數(shù)據(jù)正確性的驗證,客戶端的Javascript驗證可以沒有。這是基于安全性的考慮,因為Javascript是很容易被繞過的,增加客戶端驗證只是為了減少服務(wù)器壓力、界面更加容易使用。 \x0d\x0a\x0d\x0a2. 適度使用Session,盡量不要在Session里放很大的集合對象,以免內(nèi)存消耗過大,因為很多用戶訪問的時候會產(chǎn)生很多的Session。參數(shù)傳遞應(yīng)該盡量通過Request。熟悉HTTP有助于更好的理解Session、Cookie、Request等的機制。\x0d\x0a\x0d\x0a3. 在帶有分頁的查詢界面,盡量不要使用POST方法來傳遞參數(shù),POST傳遞的參數(shù)在地址欄里是看不到的,刷新后會有重新提交表單的提示。使用GET方法傳遞參數(shù)要注意URL的長度不能超過1K。 \x0d\x0a\x0d\x0a4. 分層應(yīng)該清晰,一般目前我們分為View(Jsp或FreeMarker加上Action)、Bean(Service)、DAO這么三層,即顯示層、業(yè)務(wù)層、數(shù)據(jù)層。記錄集ResultSet這種只能出現(xiàn)在DAO層中的對象不能出現(xiàn)在Bean(Service)層中,同樣HttpServletRequest這種只能出現(xiàn)在View層的對象也不應(yīng)出現(xiàn)在Bean(Service)層中。這并不是絕對的。 \x0d\x0a\x0d\x0a5. 盡量使用簡單SQL,避免兩表以及多表聯(lián)查。多表聯(lián)查會導(dǎo)致數(shù)據(jù)庫壓力大幅增加,而且不利于在內(nèi)存中對部分記錄進行緩存,代碼的重用性也難以提高。 \x0d\x0a\x0d\x0a6. 避免在循環(huán)里執(zhí)行findXXById這樣的方法,不如執(zhí)行一個findXXByIds這樣的方法一次性把記錄取到Map里。大部分有實際對象對應(yīng)的表應(yīng)該提供這樣一個方法。 \x0d\x0a\x0d\x0a7. 如果使用最原始的jdbc編程的話需要注意資源的正確釋放,在循環(huán)里new出來的Statement或者ResultSet就要在循環(huán)里關(guān)閉。 \x0d\x0a\x0d\x0a8. 在編寫SQL進行查詢的時候,需要能夠判斷這個SQL是否已經(jīng)使用了索引,避免全表掃描,必要的時候增加索引。 \x0d\x0a\x0d\x0a9. 在寫一個方法前,首先查看有沒有相同功能或者很類似功能的方法已經(jīng)有了,尤其是工具類方法,往往已經(jīng)寫過了,避免重復(fù)代碼的產(chǎn)生,發(fā)現(xiàn)重復(fù)代碼及時進行處理。如果一段代碼被重復(fù)使用兩遍或以上,那么可以考慮專門寫個方法來放這段代碼,同樣多次使用的常量也應(yīng)該專門定義出來。 \x0d\x0a\x0d\x0a10. 在一個方法里并不一定只能有一個return,如果已經(jīng)有結(jié)果了盡早return,沒必要增加嵌套的層次,那樣會導(dǎo)致代碼可讀性不佳,但也不能return太多,代碼看起來比較舒服就可以了。 \x0d\x0a\x0d\x0a11. 不要滿足于能夠熟練的編寫DAO和Bean(Service)的代碼,相比較而言,后臺如果在成熟框架的支持下,編碼是沒有太大難度的,也不值得沾沾自喜,因為這是對Java研發(fā)工程師基本的要求。適當(dāng)?shù)呐囵B(yǎng)一下前臺的編碼能力,學(xué)會使用Dreamweaver。不要輕視界面,也別認為這是界面設(shè)計的事情,界面對用戶來說就是軟件,學(xué)會編寫CSS和調(diào)整界面對你沒有壞處。 \x0d\x0a\x0d\x0a12. 非常明確Java和javascript作用的范圍,明確它們能做的事情。 \x0d\x0a\x0d\x0a13. 一般很奇怪的現(xiàn)象都是由一些低級錯誤引起的,如果你查了一段時間也沒有結(jié)果,那么讓別人來查吧。 \x0d\x0a\x0d\x0a14. 不要用可能被修改的字段來做主鍵,那樣會讓相關(guān)記錄的更新成為一個大麻煩。 \x0d\x0a\x0d\x0a15. 如果被迫使用Hibernate和jdbc混合操作數(shù)據(jù)庫的話,不要用Hibernate來做復(fù)雜查詢和統(tǒng)計。Hibernate用的不好的話,帶來的便利是非常有限的。 \x0d\x0a\x0d\x0a16. 數(shù)據(jù)庫中經(jīng)常被讀取,但是很少修改的話,應(yīng)該把這樣的數(shù)據(jù)讀到內(nèi)存中用OSCache之類的緩存起來,然后定期或者觸發(fā)的去更新,有助于減少讀數(shù)據(jù)庫次數(shù),提升性能。 \x0d\x0a\x0d\x0a17. 編碼的時候應(yīng)該注意部署環(huán)境帶來的影響,這種影響包括操作系統(tǒng)不同帶來路徑的差異;應(yīng)用服務(wù)器和數(shù)據(jù)庫服務(wù)器之間時間的差異;外網(wǎng)可能部署在多臺服務(wù)器上,放到Session里的對象因為需要復(fù)制所以要實現(xiàn)java.io.Serializable接口等。 \x0d\x0a\x0d\x0a18. 盡量不要在jsp上編寫太多代碼,保持jsp的整潔很重要,用Dreamweaver打開不至于一塌糊涂,根本看不出來這是個什么界面。 \x0d\x0a\x0d\x0a19. 目前我們的項目一般都使用Spring來管理數(shù)據(jù)庫事務(wù),而且一般都配置在Bean(Service)即業(yè)務(wù)層這一層,應(yīng)該注意要保持事務(wù)的完整性,不要把一些應(yīng)該放在一起的操作分散在Action這一層。相關(guān)的更新操作可以認為是一個事務(wù),比如:增加一個家長,同時更新學(xué)生是否有家長的字段。 \x0d\x0a\x0d\x0a20. 在Spring的配置中,對于有些需要保持獨立事務(wù)的方法操作,比如生成主鍵等,應(yīng)該聲明該方法為獨立事務(wù)ROPAGATION_REQUIRES_NEW。Bean(Service)里如果拋出checked exception,事務(wù)默認是不會回滾的,需要加以聲明,比如PROPAGATION_REQUIRED,-PassportException。 \x0d\x0a\x0d\x0a21. 在一個Bean(Service)中引用其他Bean(Service)的時候盡量引用Bean(Service),而不是DAO。因為其他的Bean(Service)往往封裝DAO的操作后,又做了進一步的完善,比如增加校驗等,所以應(yīng)該重用這些方法,而不必要去引用DAO的方法來重寫這些操作。 \x0d\x0a\x0d\x0a22. 至少在Bean(Service)的接口定義上增加注釋,方便他人引用你寫的方法。 \x0d\x0a\x0d\x0a23. 好好利用集合框架里的Map、List、Set。尤其是HashMap、ArrayList、HashSet用的最多,這些類是多條數(shù)據(jù)操作的基礎(chǔ),它們都不是線程安全的。 \x0d\x0a\x0d\x0a24. 現(xiàn)在跑的快的頁面,隨著數(shù)據(jù)量的增加,可能會變的很慢,所以應(yīng)該意識到頁面可能變慢的原因,而不是現(xiàn)在看起來很快。影響速度的大部分原因是對數(shù)據(jù)庫的壓力太大了,在java代碼執(zhí)行上花費很多時間的情況是不常見的。 \x0d\x0a\x0d\x0a25. 避免不必要的跳轉(zhuǎn),如果頁面執(zhí)行的足夠快,那么中間的載入進度提示頁是不必要的,那樣會讓用戶覺得閃爍。 \x0d\x0a\x0d\x0a26. 注意頁面的文件大小,并不是每個用戶的帶寬都是非常理想的,文件小一點,速度快一點,總是感覺更好一點。 \x0d\x0a\x0d\x0a27. 不要去修改用戶的瀏覽器,比如隱藏他們的地址欄、菜單、右鍵菜單等,這可能會引起部分用戶的反感。盡量不要使用彈出窗口,可能會被攔截。 \x0d\x0a\x0d\x0a28. 網(wǎng)站的權(quán)限控制至少應(yīng)該保證有訪問權(quán)限的用戶才能訪問頁面,通過隱藏鏈接之類的方法是很不安全的,用戶看不見了并不表示安全了。權(quán)限的控制盡量使用框架里的攔截器這樣的機制,而不是把權(quán)限控制代碼寫的到處都是。過濾器不宜過多的使用,不僅因為過濾器的作用范圍很難控制,而且容易引起頁面執(zhí)行效果的混亂,錯誤不易排查。 \x0d\x0a\x0d\x0a29. 頁面里大部分情況使用相對路徑,保持Action路徑層次和頁面一致,這樣應(yīng)用就可以發(fā)布在各種目錄下。

成都創(chuàng)新互聯(lián)主營欽南網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app軟件開發(fā)公司,欽南h5重慶小程序開發(fā)搭建,欽南網(wǎng)站營銷推廣歡迎欽南等地區(qū)企業(yè)咨詢

【轉(zhuǎn)】如何保護Java代碼

以下從技術(shù)角度就常見的保護措施 和常用工具來看看如何有效保護java代碼:1. 將java包裝成exe 特點:將jar包裝成可執(zhí)行文件,便于使用,但對java程序沒有任何保護。不要以為生成了exe就和普通可執(zhí)行文件效果一樣了。這些包裝成exe的程序運行時都會將jar文件釋放到臨時目錄,很容易獲取。常用的工具有exe4j、jsmooth、NativeJ等等。jsmooth生成的exe運行時臨時目錄在exe所在目錄中或是用戶臨時目錄 中;exe4j生成的exe運行時臨時目錄在用戶臨時目錄中;NativeJ生成的exe直接用winrar打開,然后用zip格式修復(fù)成一個jar文件,就得到了原文件。如果只是為了使用和發(fā)布方便,不需要保護java代碼,使用這些工具是很好的選擇。2. java混淆器特點:使用一種或多種處理方式將class文件、java源代碼進行混淆處理后生成新的class,使混淆后的代碼不易被反編譯,而反編譯后的代碼難以閱 讀和理解。這類混淆器工具很多,而且也很有成效。缺點:雖然混淆的代碼反編譯后不易讀懂,但對于有經(jīng)驗的人或是多花些時間,還是能找到或計算出你代碼中隱藏的敏感內(nèi)容,而且在很多應(yīng)用中不是全部代碼都能混淆的,往往一些關(guān)鍵的庫、類名、方法名、變量名等因使用要求的限制反而還不能混淆。3. 隔離java程序到服務(wù)端特點:把java程序放到服務(wù)端,讓用戶不能訪問到class文件和相關(guān)配套文件,客戶端只通過接口訪問。這種方式在客戶/服務(wù)模式的應(yīng)用中能較好地保護java代碼。缺點是:必須是客戶/服務(wù)模式,這種特點限制了此種方式的使用范圍;客戶端因為邏輯的暴露始終是較為薄弱的環(huán)節(jié),所以訪問接口時一般都需要安全性認證。4. java加密保護特點:自定義ClassLoader,將class文件和相關(guān)文件加密,運行時由此ClassLoader解密相關(guān)文件并裝載類,要起到保護作用必須自定 義本地代碼執(zhí)行器將自定義ClassLoader和加密解密的相關(guān)類和配套文件也保護起來。此種方式能很有效地保護java代碼。缺點:可以通過替換JRE包中與類裝載相關(guān)的java類或虛擬機動態(tài)庫截獲java字節(jié)碼。 jar2exe屬于這類工具。5. 提前編譯技術(shù)(AOT) 特點:將java代碼靜態(tài)編譯成本地機器碼,脫離通用JRE。此種方式能夠非常有效地保護java代碼,且程序啟動比通用JVM快一點。具有代表性的是GNU的gcj,可以做到對java代碼完全提前編譯,但gcj存在諸多局限性,如:對JRE 5不能完整支持、不支持JRE 6及以后的版本。由于java平臺的復(fù)雜性,做到能及時支持最新java版本和JRE的完全提前編譯是非常困難的,所以這類工具往往采取靈活方式,該用即時編譯的地方還是 要用,成為提前編譯和即時編譯的混合體。缺點:由于與通用JRE的差異和java運用中的復(fù)雜性,并非java程序中的所有jar都能得到完全的保護;只能使用此種工具提供的一個運行環(huán)境,如果工具更新滯后或你需要特定版本的JRE,有可能得不到此種工具的支持。 Excelsior JET屬于這類工具。6. 使用jni方式保護特點:將敏感的方法和數(shù)據(jù)通過jni方式處理。此種方式和“隔離java程序到服務(wù)端”有些類似,可以看作把需要保護的代碼和數(shù)據(jù)“隔離”到動態(tài)庫中,不同的是可以在單機程序中運用。缺點和上述“隔離java程序到服務(wù)端”類似。7. 不脫離JRE的綜合方式保護特點:非提前編譯,不脫離JRE,采用多種軟保護方式,從多方面防止java程序被竊取。此種方式由于采取了多種保護措施,比如自定義執(zhí)行器和裝載器、加密、JNI、安全性檢測、生成可執(zhí)行文件等等,使保護力度大大增強,同樣能夠非常有效地保護java代碼。缺點:由于jar文件存在方式的改變和java運用中的復(fù)雜性,并非java程序中的所有jar都能得到完全的保護;很有可能并不支持所有的JRE版本。 JXMaker屬于此類工具。8. 用加密鎖硬件保護特點:使用與硬件相關(guān)的專用程序?qū)ava虛擬機啟動程序加殼,將虛擬機配套文件和java程序加密,啟動的是加殼程序,由加殼程序建立一個與硬件相關(guān)的 受保護的運行環(huán)境,為了加強安全性可以和加密鎖內(nèi)植入的程序互動。此種方式與以上“不脫離JRE的綜合方式保護”相似,只是使用了專用硬件設(shè)備,也能很好地保護java代碼。缺點:有人認為加密鎖用戶使用上不太方便,且每個安裝需要附帶一個。從以上描述中我們可以看出:1. 各種保護方式都有其優(yōu)缺點,應(yīng)根據(jù)實際選用2. 要更好地保護java代碼應(yīng)該使用綜合的保護措施3. 單機環(huán)境中要真正有效保護java代碼,必須要有本地代碼程序配合當(dāng)然,安全都是相對的,一方面看你的保護措施和使用的工具能達到的程度,一方面看黑客的意愿和能力,不能只從技術(shù)上保護知識產(chǎn)權(quán)。總之,在java 代碼保護方面可以采取各種可能的方式,不可拘泥于那些條條框框。

Java語言的三種核心機制

Java語言包含三種核心機制:Java 虛擬機、垃圾收集機制和代碼安全檢測。

1、Java 虛擬機(Java Virtual Machine,JVM)

在一臺計算機上由軟件或硬件模擬的計算機。Java虛擬機讀取并處理經(jīng)編譯過的平臺無關(guān)的字節(jié)碼class文件。

2、垃圾收集機制(Garbage collection)

在C/C++ 等語言中,由程序員負責(zé)回收無用內(nèi)存。Java語言解除了程序員回收無用內(nèi)存空間的責(zé)任。它提供一種系統(tǒng)級線程跟蹤存儲空間的分配情況。并在JVM的空閑時,檢查并釋放那些可被釋放的存儲器空間。垃圾收集在Java程序運行過程中自動進行,程序員無法精確控制和干預(yù)。

3、代碼安全性檢測(Code Security)

Java執(zhí)行代碼的時候,由JVM對運行的代碼進行安全性檢測,當(dāng)進行一些非法操作的時候,比如修改一些系統(tǒng)設(shè)置的時候,JVM會發(fā)出警告。

如何保護Java程序

Java是一種跨平臺的 解釋型語言 Java 源代碼編譯中間 字節(jié)碼 存儲于class文件中 Class文件是一種字節(jié)碼形式的中間代碼 該字節(jié)碼中包括了很多源代碼的信息 例如變量名 方法名等 因此 Java中間代碼的反編譯就變得非常容易 目前市場上有許多免費的 商用的反編譯軟件 都能夠生成高質(zhì)量的反編譯后的源代碼 所以 對開發(fā)人員來說 如何保護Java程序就變成了一個非常重要的挑戰(zhàn) 本文首先討論了保護Java程序的基本方法 然后對代碼混淆問題進行深入研究 最后結(jié)合一個實際的應(yīng)用程序 分析如何在實踐中保護Java程序 反編譯成為保護Java程序的最大挑戰(zhàn) 通常C C++等編程語言開發(fā)的程序都被編譯成目標(biāo)代碼 這些目標(biāo)代碼都是本機器的二進制可執(zhí)行代碼 通常所有的源文件被編譯 鏈接成一個可執(zhí)行文件 在這些可執(zhí)行文件中 編譯器刪除了程序中的變量名稱 方法名稱等信息 這些信息往往是由內(nèi)存地址表示 例如如果需要使用一個變量 往往是通過這個變量的地址來訪問的 因此 反編譯這些本地的目標(biāo)代碼就是非常困難的 Java語言的出現(xiàn) 使得反編譯變得非常容易而有效 原因如下 由于跨平臺的需求 Java的指令集比較簡單而通用 較容易得出程序的語義信息 Java編譯器將每一個類編譯成一個單獨的文件 這也簡化了反編譯的工作 Java 的Class文件中 仍然保留所有的方法名稱 變量名稱 并且通過這些名稱來訪問變量和方法 這些符號往往帶有許多語義信息 由于Java程序自身的特點 對于不經(jīng)過處理的Java程序反編譯的效果非常好 目前 市場上有許多Java的反編譯工具 有免費的 也有商業(yè)使用的 還有的是開放源代碼的 這些工具的反編譯速度和效果都非常不錯 好的反編譯軟件 能夠反編譯出非常接近源代碼的程序 因此 通過反編譯器 黑客能夠?qū)@些程序進行更改 或者復(fù)用其中的程序 因此 如何保護Java程序不被反編譯 是非常重要的一個問題 常用的保護技術(shù) 由于Java字節(jié)碼的抽象級別較高 因此它們較容易被反編譯 本節(jié)介紹了幾種常用的方法 用于保護Java字節(jié)碼不被反編譯 通常 這些方法不能夠絕對防止程序被反編譯 而是加大反編譯的難度而已 因為這些方法都有自己的使用環(huán)境和弱點 隔離Java程序 最簡單的方法就是讓用戶不能夠訪問到Java Class程序 這種方法是最根本的方法 具體實現(xiàn)有多種方式 例如 開發(fā)人員可以將關(guān)鍵的Java Class放在服務(wù)器端 客戶端通過訪問服務(wù)器的相關(guān)接口來獲得服務(wù) 而不是直接訪問Class文件 這樣黑客就沒有辦法反編譯Class文件 目前 通過接口提供服務(wù)的標(biāo)準(zhǔn)和協(xié)議也越來越多 例如 HTTP Web Service RPC等 但是有很多應(yīng)用都不適合這種保護方式 例如對于單機運行的程序就無法隔離Java程序 這種保護方式見圖 所示   圖 隔離Java程序示意圖 對Class文件進行加密 為了防止Class文件被直接反編譯 許多開發(fā)人員將一些關(guān)鍵的Class文件進行加密 例如對注冊碼 序列號管理相關(guān)的類等 在使用這些被加密的類之前 程序首先需要對這些類進行解密 而后再將這些類裝載到JVM當(dāng)中 這些類的解密可以由硬件完成 也可以使用軟件完成 在實現(xiàn)時 開發(fā)人員往往通過自定義ClassLoader類來完成加密類的裝載(注意由于安全性的原因 Applet不能夠支持自定義的ClassLoader) 自定義的ClassLoader首先找到加密的類 而后進行解密 最后將解密后的類裝載到JVM當(dāng)中 在這種保護方式中 自定義的ClassLoader是非常關(guān)鍵的類 由于它本身不是被加密的 因此它可能成為黑客最先攻擊的目標(biāo) 如果相關(guān)的解密密鑰和算法被攻克 那么被加密的類也很容易被解密 這種保護方式示意圖見圖   圖 對Class文件進行加密示意圖 轉(zhuǎn)換成本地代碼 將程序轉(zhuǎn)換成本地代碼也是一種防止反編譯的有效方法 因為本地代碼往往難以被反編譯 開發(fā)人員可以選擇將整個應(yīng)用程序轉(zhuǎn)換成本地代碼 也可以選擇關(guān)鍵模塊轉(zhuǎn)換 如果僅僅轉(zhuǎn)換關(guān)鍵部分模塊 Java程序在使用這些模塊時 需要使用JNI技術(shù)進行調(diào)用 當(dāng)然 在使用這種技術(shù)保護Java程序的同時 也犧牲了Java的跨平臺特性 對于不同的平臺 我們需要維護不同版本的本地代碼 這將加重軟件支持和維護的工作 不過對于一些關(guān)鍵的模塊 有時這種方案往往是必要的 為了保證這些本地代碼不被修改和替代 通常需要對這些代碼進行數(shù)字簽名 在使用這些本地代碼之前 往往需要對這些本地代碼進行認證 確保這些代碼沒有被黑客更改 如果簽名檢查通過 則調(diào)用相關(guān)JNI方法 這種保護方式示意圖見圖 代碼混淆   圖 轉(zhuǎn)換成本地代碼示意圖 代碼混淆是對Class文件進行重新組織和處理 使得處理后的代碼與處理前代碼完成相同的功能(語義) 但是混淆后的代碼很難被反編譯 即反編譯后得出的代碼是非常難懂 晦澀的 因此反編譯人員很難得出程序的真正語義 從理論上來說 黑客如果有足夠的時間 被混淆的代碼仍然可能被破解 甚至目前有些人正在研制反混淆的工具 但是從實際情況來看 由于混淆技術(shù)的多元化發(fā)展 混淆理論的成熟 經(jīng)過混淆的Java代碼還是能夠很好地防止反編譯 下面我們會詳細介紹混淆技術(shù) 因為混淆是一種保護Java程序的重要技術(shù) 圖 是代碼混淆的示意圖   圖 代碼混淆示意圖 幾種技術(shù)的總結(jié) 以上幾種技術(shù)都有不同的應(yīng)用環(huán)境 各自都有自己的弱點 表 是相關(guān)特點的比較 混淆技術(shù)介紹 表 不同保護技術(shù)比較表   到目前為止 對于Java程序的保護 混淆技術(shù)還是最基本的保護方法 Java混淆工具也非常多 包括商業(yè)的 免費的 開放源代碼的 Sun公司也提供了自己的混淆工具 它們大多都是對Class文件進行混淆處理 也有少量工具首先對源代碼進行處理 然后再對Class進行處理 這樣加大了混淆處理的力度 目前 商業(yè)上比較成功的混淆工具包括JProof公司的 stBarrier系列 Eastridge公司的JShrink和的SourceGuard等 主要的混淆技術(shù)按照混淆目標(biāo)可以進行如下分類 它們分別為符號混淆(Lexical Obfuscation) 數(shù)據(jù)混淆(Data Obfuscation) 控制混淆(Control Obfuscation) 預(yù)防性混淆(Prevent Transformation) 符號混淆 在Class中存在許多與程序執(zhí)行本身無關(guān)的信息 例如方法名稱 變量名稱 這些符號的名稱往往帶有一定的含義 例如某個方法名為getKeyLength() 那么這個方法很可能就是用來返回Key的長度 符號混淆就是將這些信息打亂 把這些信息變成無任何意義的表示 例如將所有的變量從vairant_ 開始編號 對于所有的方法從method_ 開始編號 這將對反編譯帶來一定的困難 對于私有函數(shù) 局部變量 通??梢愿淖兯鼈兊姆?而不影響程序的運行 但是對于一些接口名稱 公有函數(shù) 成員變量 如果有其它外部模塊需要引用這些符號 我們往往需要保留這些名稱 否則外部模塊找不到這些名稱的方法和變量 因此 多數(shù)的混淆工具對于符號混淆 都提供了豐富的選項 讓用戶選擇是否 如何進行符號混淆 數(shù)據(jù)混淆   圖 改變數(shù)據(jù)訪問 數(shù)據(jù)混淆是對程序使用的數(shù)據(jù)進行混淆 混淆的方法也有多種 主要可以分為改變數(shù)據(jù)存儲及編碼(Store and Encode Transform) 改變數(shù)據(jù)訪問(Access Transform) 改變數(shù)據(jù)存儲和編碼可以打亂程序使用的數(shù)據(jù)存儲方式 例如將一個有 個成員的數(shù)組 拆開為 個變量 并且打亂這些變量的名字 將一個兩維數(shù)組轉(zhuǎn)化為一個一維數(shù)組等 對于一些復(fù)雜的數(shù)據(jù)結(jié)構(gòu) 我們將打亂它的數(shù)據(jù)結(jié)構(gòu) 例如用多個類代替一個復(fù)雜的類等 另外一種方式是改變數(shù)據(jù)訪問 例如訪問數(shù)組的下標(biāo)時 我們可以進行一定的計算 圖 就是一個例子 在實踐混淆處理中 這兩種方法通常是綜合使用的 在打亂數(shù)據(jù)存儲的同時 也打亂數(shù)據(jù)訪問的方式 經(jīng)過對數(shù)據(jù)混淆 程序的語義變得復(fù)雜了 這樣增大了反編譯的難度 控制混淆 控制混淆就是對程序的控制流進行混淆 使得程序的控制流更加難以反編譯 通常控制流的改變需要增加一些額外的計算和控制流 因此在性能上會給程序帶來一定的負面影響 有時 需要在程序的性能和混淆程度之間進行權(quán)衡 控制混淆的技術(shù)最為復(fù)雜 技巧也最多 這些技術(shù)可以分為如下幾類 增加混淆控制 通過增加額外的 復(fù)雜的控制流 可以將程序原來的語義隱藏起來 例如 對于按次序執(zhí)行的兩個語句A B 我們可以增加一個控制條件 以決定B的執(zhí)行 通過這種方式加大反匯編的難度 但是所有的干擾控制都不應(yīng)該影響B(tài)的執(zhí)行 圖 就給出三種方式 為這個例子增加混淆控制   圖 增加混淆控制的三種方式 控制流重組 重組控制流也是重要的混淆方法 例如 程序調(diào)用一個方法 在混淆后 可以將該方法代碼嵌入到調(diào)用程序當(dāng)中 反過來 程 lishixinzhi/Article/program/Java/JSP/201311/19576


文章名稱:java代碼安全性注意 java 代碼安全
文章源于:http://weahome.cn/article/ddjdhhe.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部