對(duì)于程序員來說,養(yǎng)成良好的代碼寫作能力是非常重要的。
創(chuàng)新互聯(lián)是一家專注網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷策劃、微信小程序定制開發(fā)、電子商務(wù)建設(shè)、網(wǎng)絡(luò)推廣、移動(dòng)互聯(lián)開發(fā)、研究、服務(wù)為一體的技術(shù)型公司。公司成立十年以來,已經(jīng)為上千家成都混凝土攪拌機(jī)各業(yè)的企業(yè)公司提供互聯(lián)網(wǎng)服務(wù)。現(xiàn)在,服務(wù)的上千家客戶與我們一路同行,見證我們的成長(zhǎng);未來,我們一起分享成功的喜悅。
今天,我們就一起來了解一下,規(guī)范化的代碼編寫都有哪些要求。
希望通過對(duì)本文的閱讀,能夠提高大家對(duì)于代碼規(guī)范的認(rèn)識(shí)。
1.保證代碼壓縮后不出錯(cuò)對(duì)于大型的JSP項(xiàng)目,一般會(huì)在產(chǎn)品發(fā)布時(shí)對(duì)項(xiàng)目包含的所有JSP文件進(jìn)行壓縮處理,比如可以利用GoogleClosureCompilerService對(duì)代碼進(jìn)行壓縮,新版jQuery已改用這一工具對(duì)代碼進(jìn)行壓縮,這一般會(huì)去掉開發(fā)時(shí)寫的注釋,除去所有空格和換行,甚至可以把原來較長(zhǎng)的變量名替換成短且無意義的變量名,這樣做的目的是加快文件的下載速度,同時(shí)也減小網(wǎng)站訪問帶來的額外數(shù)據(jù)流量,另外在代碼保護(hù)上也起到了一點(diǎn)點(diǎn)作用,至少壓縮后的代碼即使被還原還是沒那么容易一下讀懂的。
要想代碼能正確通過壓縮,一般要求語句都要以分號(hào)正常結(jié)束,大括號(hào)也要嚴(yán)格結(jié)束等,具體還要看壓縮工具的要求。
所以如果一開始沒有按標(biāo)準(zhǔn)來做,等壓縮出錯(cuò)后再回去找錯(cuò)誤那是浪費(fèi)時(shí)間。
2.保證代碼能通過特定IDE的自動(dòng)格式化功能一般較為完善的開發(fā)工具(比如AptanaStudio)都有代碼"自動(dòng)格式"化功能,這一功能幫助實(shí)現(xiàn)統(tǒng)一換行、縮進(jìn)、空格等代碼編排,你可以設(shè)置自己喜歡的格式標(biāo)準(zhǔn),比如左大括號(hào){是否另起一行。
達(dá)到這個(gè)要求的目的在于方便你的開發(fā)團(tuán)隊(duì)成員拿你代碼的一個(gè)副本用IDE自動(dòng)格式化成他喜歡或熟悉的風(fēng)格進(jìn)行閱讀。
你同事需要閱讀你的代碼,可能是因?yàn)槟銓懙氖峭ㄓ梅椒ǎ谄渌K開發(fā)過程中也要使用到,閱讀你的代碼能深入了解方法調(diào)用和實(shí)現(xiàn)的細(xì)節(jié),這是簡(jiǎn)單API文檔不能達(dá)到的效果。
3.使用標(biāo)準(zhǔn)的文檔注釋這一要求算是基本的,這有利于在方法調(diào)用處看到方法的具體傳參提示,也可以利用配套文檔工具生成html或其它格式的開發(fā)文檔供其他團(tuán)隊(duì)成員閱讀,你可以嘗試使用jsdoc-toolkit。
如果你自動(dòng)生成的API是出自一個(gè)開放平臺(tái),就像facebook.com應(yīng)用,那么你的文檔是給天下所有開發(fā)者看的。
另外編寫完整注釋,也更方便團(tuán)隊(duì)成員閱讀你的代碼,通過你的參數(shù)描述,團(tuán)隊(duì)成員可以很容易知道你編寫的方法傳參與實(shí)現(xiàn)細(xì)節(jié)。
當(dāng)然也方便日后代碼維護(hù),這樣即使再大的項(xiàng)目,過了很長(zhǎng)時(shí)間后,回去改點(diǎn)東西也就不至于自己都忘記了當(dāng)時(shí)自己寫的代碼是怎么一回事了。
4.使用規(guī)范有意義的變量名使用規(guī)范有意義的變量名可以提高代碼的可讀性,作為大項(xiàng)目開發(fā)成員,自己寫的代碼不僅僅要讓別人容易看懂。
電腦培訓(xùn)認(rèn)為開發(fā)大項(xiàng)目,其實(shí)每個(gè)人寫的代碼量可能都比較大,規(guī)范命名,日后自己看回自己的代碼也顯的清晰易懂,比如日后系統(tǒng)升級(jí)或新增功能,修改起代碼來也輕松多了。
如果到頭發(fā)現(xiàn)自己當(dāng)初寫的代碼現(xiàn)在看不太懂了,那還真是天大的笑話了。
其實(shí)理論上,任何代碼都能被反編譯,你再好的混淆技術(shù),也只是讓代碼變得復(fù)雜,不容易看懂,但肯定是有人能看懂,僅僅是時(shí)間花得更多。現(xiàn)在借助工具來整理線索很容易找出變量之間的關(guān)聯(lián)而猜測(cè)出它的用途。如果你覺得C能保證安全水平更好,那可以加掛 Java 6 開始支持的 Instrument,它可以支持對(duì) class 文件進(jìn)行解密。我們?cè)诰幾g好代碼后手工加密后這個(gè) 運(yùn)行時(shí)的 instrument 能解密,而這部分功能用 dll 來做,不過,還是那句話,沒有理論上不能被反編譯破解的代碼。
您好。感謝您給我這次回答的機(jī)會(huì)。
首先,我認(rèn)為這個(gè)有兩種方法,看你怎么選。
第一種:
限制代碼庫只能在公司內(nèi)網(wǎng)訪問,公司之外懷能下載代碼;
限制只能用公司的電腦下載代碼、編寫代碼、提交代碼;
限制訪問代碼庫的權(quán)限,發(fā)人員不授予訪問和自己不相關(guān)代碼庫的權(quán)限;
能訪問代碼的電腦上安裝監(jiān)控軟件,號(hào)稱可以監(jiān)控所有員工活動(dòng);
設(shè)置公司網(wǎng)絡(luò)防火墻,禁止訪問github這樣的開源網(wǎng)站;
把上面所有的規(guī)矩記錄下來,教育員工知道,讓他們簽字畫押必須遵守,鈑者開除而且報(bào)警。
第二種:
招募受過良好教育、品行良好、專業(yè)團(tuán)隊(duì)工作經(jīng)驗(yàn)的開發(fā)者;
對(duì)開發(fā)者友善,讓他們不會(huì)對(duì)公司心懷怨恨;
把開發(fā)者的利益和公司利益關(guān)聯(lián)起來,讓他們不想為了蠅頭小利犧牲公司利益。
其次,你可能不知道的東西。
1.絕大部分的公司(bat另說) 手中的源代碼商業(yè)價(jià)值根本不高。
2.絕大部分的公司的源碼質(zhì)量都比不過github的哪些開源類庫。
3.絕大部分的公司的源碼都屬于高度定制化的開發(fā)(就是換個(gè)公司,這個(gè)軟件幾乎就沒有什么價(jià)值了)。
4.絕大部分的公司都不是靠“軟件技術(shù)”賺錢的。
5.絕大部分的人都不會(huì)傻到直接把偷來的源碼用于“商業(yè)活動(dòng)”(非但不一定賺錢還可能吃官司,還不如去github上扒開源代碼)
6."防御"的成本數(shù)倍于"重新開發(fā)一套"軟件.
所以看淡一點(diǎn)源碼,它在絕大多數(shù)公司中其實(shí)并不值”幾個(gè)錢“雖然它的創(chuàng)造成本可能”很貴“。
所以說,這些東西掌握以后,就基本上不用擔(dān)心代碼被泄露了。
理論上做到公司電腦無法和外界連通,進(jìn)出人員不得攜帶任何外設(shè)就可以徹底解決代碼泄漏的問題。但是商業(yè)公司比較難做到。下面我們來的分析一下員工有沒必要竊取代碼,有沒能力竊取到下完整的代碼。
現(xiàn)在有一定規(guī)模的公司應(yīng)用都是服務(wù)化的,不同的小組負(fù)責(zé)不同的服務(wù),有各自的代碼查看權(quán)限。所以一個(gè)或者幾個(gè)程序員無法拿到全部代碼。
超大規(guī)模的應(yīng)用就更復(fù)雜了,有前臺(tái),中臺(tái),后臺(tái),APP等,架構(gòu)也極其復(fù)雜,就算某個(gè)程序員獲得到了全部代碼,也沒有能力搭建并運(yùn)行起來。
小規(guī)模公司的代碼基本都是業(yè)務(wù)邏輯代碼,泄不泄漏可能也沒有太大關(guān)系。
防止別人偷拿代碼是很難的,倒不如加強(qiáng)企業(yè)文化,提高員工的職業(yè)素養(yǎng)。尊重是互相的,做到用人不疑,我想大部分人也不會(huì)以怨報(bào)德。
說說我們公司是怎么做的吧:
1. 封了百度文庫、百度網(wǎng)盤、CSDN等網(wǎng)站
凡是能上傳文件的網(wǎng)站,我們公司都封了,這樣就防止員工把內(nèi)部文件上傳到這些網(wǎng)站被泄密。但是這樣做的一個(gè)后果就是員工想查一些資料,在這些網(wǎng)站都打不開,只能用自己的手機(jī)去查了,造成了一些工作的不便。
2. 封了USB、藍(lán)牙接口,以及光驅(qū)
凡是能從電腦上拷貝文件到外部的接口,我們公司都封了,這樣員工就無法把公司的文件拷到外面了,避免了泄密。這樣做的后果也給我們帶來了一些工作上的不便。比如以前我們做藍(lán)牙測(cè)試的時(shí)候,需要把測(cè)試的App拷貝到手機(jī)上舊非常困難。后來公司了解了我們的困難,允許我們提申請(qǐng),經(jīng)過上級(jí)領(lǐng)導(dǎo)的批準(zhǔn)后,可以給電腦開通USB權(quán)限,但是拷貝的內(nèi)容也是被公司監(jiān)控,所以也只能拷貝需要的內(nèi)容。申請(qǐng)的時(shí)候有選擇開通的時(shí)間,到期后,USB權(quán)限自動(dòng)關(guān)閉了。
3. 禁止將公司電腦帶出公司
為了防止員工私下里想辦法把公司電腦的文件拷走,公司禁止把電腦帶出辦公室。如果需要帶電腦去客戶那里,則需要向公司提出申請(qǐng),申請(qǐng)的時(shí)候也要選擇帶出和帶回的時(shí)間,這樣基本上就杜絕了員工泄密的可能。如果員工在外出途中丟失了電腦,這就會(huì)成為一個(gè)大事件,會(huì)匯報(bào)到公司最高層,對(duì)員工個(gè)人的影響也很大。公司有一套流程專門應(yīng)對(duì)這類事件。曾經(jīng)我們公司有人帶電腦去客戶那里,跟客戶吃飯喝醉了,打車回家把電腦弄丟了,引起了很大的后果,這個(gè)事經(jīng)常會(huì)作為事例來教育全體員工。
4. 電腦里安裝監(jiān)控軟件
公司的電腦里都安裝有監(jiān)控軟件,網(wǎng)管可以監(jiān)控到每一臺(tái)電腦。員工在電腦上打印,發(fā)傳真、發(fā)郵件這些活動(dòng)都受到監(jiān)控。打印機(jī)也能看到每個(gè)人打印、傳真的內(nèi)容。員工如果有泄密的行為都可以及時(shí)監(jiān)控到。至于員工對(duì)著電腦拍照,公司應(yīng)該也能檢測(cè)到。所以公司的電腦不要做一些私人的事情,很容易被監(jiān)控到。
5. 封了QQ、微信等可以傳輸文件的社交軟件
QQ、微信這類可以傳遞文件的社交軟件在公司的電腦上是不能安裝的,也防止了員工通過這些軟件把文件傳輸?shù)酵饷妗9緝?nèi)部只能使用微軟自帶的聊天工具Lync,這個(gè)軟件也不能傳輸文件,只能聊天。如果公司內(nèi)部需要傳輸文件,只能用公司的服務(wù)器或者郵件。有些大的文件,只能盡量壓縮,否則傳輸會(huì)非常不方便。
6. 禁止員工安裝公司允許之外的軟件
嚴(yán)格監(jiān)控員工的軟件安裝列表。公司給出了允許安裝的軟件列表,超出范圍的安裝軟件會(huì)被監(jiān)控到,讓員工刪除掉。這樣員工無法安裝一些上傳文件的軟件了,防止泄密了。員工也不能隨意從網(wǎng)絡(luò)上下載安裝文件,防止一些木馬病毒藏在軟件里,盜取公司文件。
公司防止員工泄密的手段是很多的,每年還要對(duì)員工進(jìn)行安全教育,規(guī)范員工的行為。
虛擬化桌面服務(wù)器,使用虛擬桌面和瘦客戶機(jī),瘦客戶機(jī)禁止usb存儲(chǔ)。瘦客戶機(jī)不能聯(lián)網(wǎng)但可以連虛擬化服務(wù)器,服務(wù)器不能連外網(wǎng)。單獨(dú)設(shè)立一臺(tái)機(jī)器可以聯(lián)網(wǎng),也可以連接一臺(tái)ftp虛擬機(jī)(虛擬化服務(wù)器中的FTP用于內(nèi)外網(wǎng)共享文件),聯(lián)網(wǎng)機(jī)器下載的東西了上傳到ftp供其他桌面虛擬機(jī)使用。桌面虛擬機(jī)上傳的文件需要管理員通過才能被這臺(tái)外網(wǎng)機(jī)器看到下載。
1,不允許攜帶電子設(shè)備進(jìn)入工作區(qū)域,進(jìn)門經(jīng)過金屬探測(cè)。
2,公司電腦不允許連接外網(wǎng)。
3,封死USB等外設(shè)接口。
4,機(jī)箱鎖死,防止拆硬盤。
5,安裝攝像頭對(duì)準(zhǔn)每一個(gè)工位,一旦發(fā)現(xiàn)使用拍照設(shè)備等,進(jìn)行相應(yīng)處罰。
這幾個(gè)只有一起用才能完全防止泄露,否則都有辦法。
你去看看某研究院的一些規(guī)章。禁止筆記本等帶入,不小心帶入了,對(duì)不起,設(shè)備留置24小時(shí),徹底格式化。手機(jī),存儲(chǔ)設(shè)備也一樣禁止帶入。開發(fā)機(jī)全部?jī)?nèi)網(wǎng)。沒有WIFI,鼠標(biāo)鍵盤全部有線,粘死。機(jī)箱上鎖。USB等接口全部封掉。人員權(quán)限限制,絕大部分人員不能下載全部代碼。
首先管理層面,領(lǐng)導(dǎo)要重視信息安全,然后按照iso27000系列信息安全標(biāo)準(zhǔn)去做。信息安全和物理安全是要互相配合的。辦公區(qū)要根據(jù)安全級(jí)別設(shè)置不同的管理措施,信息資產(chǎn)要根據(jù)價(jià)值設(shè)置不同的標(biāo)簽,區(qū)分關(guān)鍵資產(chǎn)和非關(guān)鍵資產(chǎn),另外信息資產(chǎn)只能有一個(gè)出口要經(jīng)過審批后才能出去。技術(shù)層面的措施也可以用,但是不能亂用。另外開發(fā)環(huán)境安全可以參考15408的站點(diǎn)審查部分。
防止不了,有合作公司管理嚴(yán)格,我們都用手機(jī)拍照溝通,所以除非禁用手機(jī)和一切拍照設(shè)備,否則都給你拍出來。
我覺吧吧,關(guān)鍵是人。而不是制度。
這么說吧,光有源代碼屁也不是。要是沒人build都困難。別說上線和運(yùn)行了。
所以,你要是選信任的人,而不是選信任的方法。那么就算別人真偷了,拿一堆源代碼回去,都沒辦法build,有什么用?
反之,就算沒有源代碼。人家拍拍屁股走人。然后還他媽實(shí)現(xiàn),你有什么辦法?
java編程一直以來都是互聯(lián)網(wǎng)軟件開發(fā)市場(chǎng)上的主流開發(fā)語言,同樣的這也就導(dǎo)致了只要發(fā)生漏洞的話,所有用java編程開發(fā)的軟件都會(huì)出現(xiàn)問題,下面合肥java培訓(xùn)就一起來了解一下,java編程語言中的序列化問題應(yīng)該如何解決。
什么是序列化?自從1997年發(fā)布JDK1.1以來,序列化已經(jīng)存在于Java平臺(tái)中。
它用于在套接字之間共享對(duì)象表示,或者將對(duì)象及其狀態(tài)保存起來以供將來使用(反序列化)。
在JDK10及更低版本中,序列化作為java.base包和java.io.Serializable方法的一部分存在于所有的系統(tǒng)中。
序列化的挑戰(zhàn)和局限序列化的局限主要表現(xiàn)在以下兩個(gè)方面:出現(xiàn)了新的對(duì)象傳輸策略,例如JSON、XML、ApacheAvro、ProtocolBuffers等。
1997年的序列化策略無法預(yù)見現(xiàn)代互聯(lián)網(wǎng)服務(wù)的構(gòu)建和攻擊方式。
進(jìn)行序列化漏洞攻擊的基本前提是找到對(duì)反序列化的數(shù)據(jù)執(zhí)行特權(quán)操作的類,然后傳給它們惡意的代碼。
序列化在哪里?如何知道我的應(yīng)用程序是否用到了序列化?要移除序列化,需要從java.io包開始,這個(gè)包是java.base模塊的一部分。
常見的使用場(chǎng)景是:實(shí)現(xiàn)Serializable接口和(可選)serialversionuid長(zhǎng)整型字段。
使用ObjectInputStream或ObjectOutputStream。
使用嚴(yán)重依賴序列化的庫,例如:Xstream、Kryo、BlazeDS和大多數(shù)應(yīng)用程序服務(wù)器。
使用這些方法的開發(fā)人員應(yīng)考慮使用其他存儲(chǔ)和讀回?cái)?shù)據(jù)的替代方法。
EishaySmith發(fā)布了幾個(gè)不同序列化庫的性能指標(biāo)。
在評(píng)估性能時(shí),需要在基準(zhǔn)度量指標(biāo)中包含安全方面的考慮。
默認(rèn)的Java序列化“更快”一些,但漏洞也會(huì)以同樣的速度找上門來。
我們?cè)撊绾谓档托蛄谢毕莸挠绊?項(xiàng)目Amber包含了一個(gè)關(guān)于將序列化API隔離出來的討論。
我們的想法是將序列化從java.base移動(dòng)到單獨(dú)的模塊,這樣應(yīng)用程序就可以完全移除它。
在確定JDK11功能集時(shí)并沒有針對(duì)該提議得出任何結(jié)果,但可能會(huì)在未來的Java版本中繼續(xù)進(jìn)行討論。
通過運(yùn)行時(shí)保護(hù)來減少序列化暴露一個(gè)可以監(jiān)控風(fēng)險(xiǎn)并自動(dòng)化可重復(fù)安全專業(yè)知識(shí)的系統(tǒng)對(duì)于很多企業(yè)來說都是很有用的。
Java應(yīng)用程序可以將JVMTI工具嵌入到安全監(jiān)控系統(tǒng)中,通過插樁的方式將傳感器植入到應(yīng)用程序中。
其他有用的安全技術(shù)在進(jìn)行維護(hù)時(shí),可以不需要手動(dòng)列出一長(zhǎng)串東西,而是使用像OWASPDependency-Check這樣的系統(tǒng),它可以識(shí)別出已知安全漏洞的依賴關(guān)系,并提示進(jìn)行升級(jí)。
也可以考慮通過像DependABot這樣的系統(tǒng)進(jìn)行庫的自動(dòng)更新。
雖然用意很好,但默認(rèn)的Oracle序列化過濾器存在與SecurityManager和相關(guān)沙箱漏洞相同的設(shè)計(jì)缺陷。
因?yàn)樾枰煜巧珯?quán)限并要求提前了解不可知的事物,限制了這個(gè)功能的大規(guī)模采用:系統(tǒng)管理員不知道代碼的內(nèi)容,所以無法列出類文件,而開發(fā)人員不了解環(huán)境,甚至DevOps團(tuán)隊(duì)通常也不知道系統(tǒng)其他部分(如應(yīng)用程序服務(wù)器)的需求。
Java語言是一種非常適用于網(wǎng)絡(luò)編程的語言,它的基本結(jié)構(gòu)與C++極為相似,但拋棄了C/C++中指針等內(nèi)容,同時(shí)它吸收了Smalltalk、C++面向?qū)ο蟮木幊趟枷搿K哂泻?jiǎn)單性、魯棒性、可移植性、動(dòng)態(tài)性等特點(diǎn)。這些特點(diǎn)使得Java成為跨平臺(tái)應(yīng)用開發(fā)的一種規(guī)范,在世界范圍內(nèi)廣泛流傳。 加密Java源碼的原因 Java源代碼經(jīng)過編譯以后在JVM中執(zhí)行。由于JVM界面是完全透明的,Java類文件能夠很容易通過反編譯器重新轉(zhuǎn)換成源代碼。因此,所有的算法、類文件等都可以以源代碼的形式被公開,使得軟件不能受到保護(hù),為了保護(hù)產(chǎn)權(quán),一般可以有以下幾種方法: (1)"模糊"類文件,加大反編譯器反編譯源代碼文件的難度。然而,可以修改反編譯器,使之能夠處理這些模糊類文件。所以僅僅依賴"模糊類文件"來保證代碼的安全是不夠的。 (2)流行的加密工具對(duì)源文件進(jìn)行加密,比如PGP(Pretty Good Privacy)或GPG(GNU Privacy Guard)。這時(shí),最終用戶在運(yùn)行應(yīng)用之前必須先進(jìn)行解密。但解密之后,最終用戶就有了一份不加密的類文件,這和事先不進(jìn)行加密沒有什么差別。 (3)加密類文件,在運(yùn)行中JVM用定制的類裝載器(Class Loader)解密類文件。Java運(yùn)行時(shí)裝入字節(jié)碼的機(jī)制隱含地意味著可以對(duì)字節(jié)碼進(jìn)行修改。JVM每次裝入類文件時(shí)都需要一個(gè)稱為ClassLoader的對(duì)象,這個(gè)對(duì)象負(fù)責(zé)把新的類裝入正在運(yùn)行的JVM。JVM給ClassLoader一個(gè)包含了待裝入類(例如java.lang.Object)名字的字符串,然后由ClassLoader負(fù)責(zé)找到類文件,裝入原始數(shù)據(jù),并把它轉(zhuǎn)換成一個(gè)Class對(duì)象。 用戶下載的是加密過的類文件,在加密類文件裝入之時(shí)進(jìn)行解密,因此可以看成是一種即時(shí)解密器。由于解密后的字節(jié)碼文件永遠(yuǎn)不會(huì)保存到文件系統(tǒng),所以竊密者很難得到解密后的代碼。 由于把原始字節(jié)碼轉(zhuǎn)換成Class對(duì)象的過程完全由系統(tǒng)負(fù)責(zé),所以創(chuàng)建定制ClassLoader對(duì)象其實(shí)并不困難,只需先獲得原始數(shù)據(jù),接著就可以進(jìn)行包含解密在內(nèi)的任何轉(zhuǎn)換。 Java密碼體系和Java密碼擴(kuò)展 Java密碼體系(JCA)和Java密碼擴(kuò)展(JCE)的設(shè)計(jì)目的是為Java提供與實(shí)現(xiàn)無關(guān)的加密函數(shù)API。它們都用factory方法來創(chuàng)建類的例程,然后把實(shí)際的加密函數(shù)委托給提供者指定的底層引擎,引擎中為類提供了服務(wù)提供者接口在Java中實(shí)現(xiàn)數(shù)據(jù)的加密/解密,是使用其內(nèi)置的JCE(Java加密擴(kuò)展)來實(shí)現(xiàn)的。Java開發(fā)工具集1.1為實(shí)現(xiàn)包括數(shù)字簽名和信息摘要在內(nèi)的加密功能,推出了一種基于供應(yīng)商的新型靈活應(yīng)用編程接口。Java密碼體系結(jié)構(gòu)支持供應(yīng)商的互操作,同時(shí)支持硬件和軟件實(shí)現(xiàn)。 Java密碼學(xué)結(jié)構(gòu)設(shè)計(jì)遵循兩個(gè)原則: (1)算法的獨(dú)立性和可靠性。 (2)實(shí)現(xiàn)的獨(dú)立性和相互作用性。 算法的獨(dú)立性是通過定義密碼服務(wù)類來獲得。用戶只需了解密碼算法的概念,而不用去關(guān)心如何實(shí)現(xiàn)這些概念。實(shí)現(xiàn)的獨(dú)立性和相互作用性通過密碼服務(wù)提供器來實(shí)現(xiàn)。密碼服務(wù)提供器是實(shí)現(xiàn)一個(gè)或多個(gè)密碼服務(wù)的一個(gè)或多個(gè)程序包。軟件開發(fā)商根據(jù)一定接口,將各種算法實(shí)現(xiàn)后,打包成一個(gè)提供器,用戶可以安裝不同的提供器。安裝和配置提供器,可將包含提供器的ZIP和JAR文件放在CLASSPATH下,再編輯Java安全屬性文件來設(shè)置定義一個(gè)提供器。Java運(yùn)行環(huán)境Sun版本時(shí), 提供一個(gè)缺省的提供器Sun。 下面介紹DES算法及如何利用DES算法加密和解密類文件的步驟。 DES算法簡(jiǎn)介 DES(Data Encryption Standard)是發(fā)明最早的最廣泛使用的分組對(duì)稱加密算法。DES算法的入口參數(shù)有三個(gè):Key、Data、Mode。
由于Java字節(jié)碼的抽象級(jí)別較高,因此它們較容易被反編譯。下面介紹了幾種常用的方法,用于保護(hù)Java字節(jié)碼不被反編譯。通常,這些方法不能夠絕對(duì)防止程序被反編譯,而是加大反編譯的難度而已,因?yàn)檫@些方法都有自己的使用環(huán)境和弱點(diǎn)。
1.隔離Java程序
最簡(jiǎn)單的方法就是讓用戶不能夠訪問到Java Class程序,這種方法是最根本的方法,具體實(shí)現(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)用都不適合這種保護(hù)方式,例如對(duì)于單機(jī)運(yùn)行的程序就無法隔離Java程序。
2.對(duì)Class文件進(jìn)行加密
為了防止Class文件被直接反編譯,許多開發(fā)人員將一些關(guān)鍵的Class文件進(jìn)行加密,例如對(duì)注冊(cè)碼、序列號(hào)管理相關(guān)的類等。在使用這些被加密的類之前,程序首先需要對(duì)這些類進(jìn)行解密,而后再將這些類裝載到JVM當(dāng)中。這些類的解密可以由硬件完成,也可以使用軟件完成。
在實(shí)現(xiàn)時(shí),開發(fā)人員往往通過自定義ClassLoader類來完成加密類的裝載(注意由于安全性的原因,Applet不能夠支持自定義的ClassLoader)。自定義的ClassLoader首先找到加密的類,而后進(jìn)行解密,最后將解密后的類裝載到JVM當(dāng)中。在這種保護(hù)方式中,自定義的ClassLoader是非常關(guān)鍵的類。由于它本身不是被加密的,因此它可能成為黑客最先攻擊的目標(biāo)。如果相關(guān)的解密密鑰和算法被攻克,那么被加密的類也很容易被解密。
3.轉(zhuǎn)換成本地代碼
將程序轉(zhuǎn)換成本地代碼也是一種防止反編譯的有效方法。因?yàn)楸镜卮a往往難以被反編譯。開發(fā)人員可以選擇將整個(gè)應(yīng)用程序轉(zhuǎn)換成本地代碼,也可以選擇關(guān)鍵模塊轉(zhuǎn)換。如果僅僅轉(zhuǎn)換關(guān)鍵部分模塊,Java程序在使用這些模塊時(shí),需要使用JNI技術(shù)進(jìn)行調(diào)用。當(dāng)然,在使用這種技術(shù)保護(hù)Java程序的同時(shí),也犧牲了Java的跨平臺(tái)特性。對(duì)于不同的平臺(tái),我們需要維護(hù)不同版本的本地代碼,這將加重軟件支持和維護(hù)的工作。不過對(duì)于一些關(guān)鍵的模塊,有時(shí)這種方案往往是必要的。為了保證這些本地代碼不被修改和替代,通常需要對(duì)這些代碼進(jìn)行數(shù)字簽名。在使用這些本地代碼之前,往往需要對(duì)這些本地代碼進(jìn)行認(rèn)證,確保這些代碼沒有被黑客更改。如果簽名檢查通過,則調(diào)用相關(guān)JNI方法。
4.代碼混淆
代碼混淆是對(duì)Class文件進(jìn)行重新組織和處理,使得處理后的代碼與處理前代碼完成相同的功能(語義)。但是混淆后的代碼很難被反編譯,即反編譯后得出的代碼是非常難懂、晦澀的,因此反編譯人員很難得出程序的真正語義。從理論上來說,黑客如果有足夠的時(shí)間,被混淆的代碼仍然可能被破解,甚至目前有些人正在研制反混淆的工具。但是從實(shí)際情況來看,由于混淆技術(shù)的多元化發(fā)展,混淆理論的成熟,經(jīng)過混淆的Java代碼還是能夠很好地防止反編譯。下面我們會(huì)詳細(xì)介紹混淆技術(shù),因?yàn)榛煜且环N保護(hù)Java程序的重要技術(shù)。
分享文章:如何保護(hù)代碼java,如何保護(hù)代碼產(chǎn)權(quán)
標(biāo)題URL:http://chinadenli.net/article22/hecojc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、手機(jī)網(wǎng)站建設(shè)、品牌網(wǎng)站制作、網(wǎng)站收錄、網(wǎng)站策劃、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)