RubyEncoder通過編譯和加密來保護Ruby和Ruby on Rails檔案。經過加密的指令碼由RubyEncoder的載入器來運行。RubyEncoder是由Inovica Ltd開發的。他們還為PHP做了一個類似的東西:SourceGuardian。
RubyEncoder還能保護工程的一部分,允許明文的Ruby代碼和設定檔的存在;還可以把程式限制在特定主域上,或設定一個期限來建立試用版(詳見RubyEncoder FAQ部分)。
InfoQ採訪了RubyEncoder的領銜開發人員Alexander Belonosov,從技術的角度來談談該項目。
InfoQ:編碼和載入/運行是如何進行的?
首先把Ruby原始碼編譯成內部的中間格式,然後進行加密。一旦編碼之後,原始碼就不在被保護的指令碼裡了。你需要安裝
RubyEncoder載入器來運行被保護的指令碼。載入器實際上是一個Ruby擴充,用來解碼和運行被保護的指令碼。被保護的指令碼是與平台無關的,這點很重
要,你可以在所有支援的平台上運行它。不同的作業系統和平台的載入器是不同的。我們支援以下平台:OSX、Linux、FreeBSD,以及我們最近才開
始支援的Solaris x86。我們還打算近期加入對Windows和其他UNIX的支援。
InfoQ:原始碼會被轉換為一種中間格式。你們有沒有自己的解譯器來運行它,還是需要還原成原始的Ruby代碼?
原始的Ruby代碼是不可能還原出來的。我們使用內部的中間格式。[..] 它是內部的、二進位的、可執行檔,並且絕不可能還原出原始代碼。
InfoQ:要是你們有自己的解譯器,它如何支援元編程(metaprogramming)以及Ruby的其他動態特性?或者說,難道沒有什麼限制嗎?
目
前,載入器會把代碼的內部表示返回給Ruby來執行。這讓我們擁有最大的相容性,並保持Ruby代碼的動態本質。但是,我們仍在尋找其他辦法,在產品的下
一個版本來改變或者實現一個新的方案。不管怎樣,使用RubyEncoder來保護產品將會對終端使用者是透明的,而且Ruby開發人員會得到更進階的、更高
效的編碼器。
InfoQ:我們可以使用ParseTree gem包訪問一個類或一個方法的解析樹。RubyEncoder會影響到它嗎?
ParseTree
是個很棒的擴充,可以用來研究Ruby內部以及代碼最佳化等。如果你是想問我們是否限制使用ParseTree,那麼答案是不會。當你使用
ParseTree之類的工具時,你必須知道需要把什麼從Ruby內部提取出來,以及如何發現它。我認為你還必須思考其原因,消耗的時間,以及最終的結果
是什麼:-)
InfoQ:你們是否打算支援其他Ruby實現版本,比如JRuby?有沒有可能把載入器移植到Java上來運行JRuby代碼?
目前我們僅支援標準Ruby。JRuby是個很棒的項目,並且在日益成長。不過針對的市場會有一點不同。
InfoQ:使用JRuby和編譯過的Ruby源碼,ByteCode混淆器是不是也能達到跟RubyEncoder同樣的效果?
使用JRuby和經過編譯的Ruby源碼也許能得到很高的保護等級。但是它面對的是Java環境。而我們的初衷是保護本地Ruby和Ruby on Rails工程,將來也許會決定加強或者擴充我們的產品。
InfoQ:RubyEncoder是用什麼語言寫的?用Ruby,然後自己加密自己?
不是,我並不是說Ruby元編程不好 但RubyEncoder和載入器是用C寫的。
RubyEncoder是一個商用產品,這裡提供一個30天試用版。
你曾使用過這樣的代碼保護工具嗎?有沒有什麼經驗來分享?
查看英文原文:RubyEncoder: Obfuscation and Code Protection for Ruby