密碼學與網路安全 – 加密程式撰寫示範 之 Java 的設定與安裝

在開始之前:

本文章為配合國立東華大學 資訊管理學系 107學年度 第二學期 IM-47140 密碼學與網路安全 課程之 加密程式撰寫示範 使用。請依您的個人需求取用教材。




本次課程助教所示範的程式皆以Java 所撰寫,故我們需要完整的設定Java 的系統環境與開發程式。

助教寫這些示範程式的環境:

  • 作業系統: Fedora 28
  • 所使用JDK: OpenJDK 8 (Java 8) / OpenJDK 10 (Java 10)

Java 語言的特性:

  • 簡單(Simple)

    • Java 可說是借了 C/C++ 十分多的特性,但移除了許多難以掌握或操控的部分,像是 Java 並無Pointer 的概念,也不允許程式設計師直接對記憶體位置進行操控,對於資源的管理也十分的自動,Garbage Collector 機制會自訂移除已經不再被使用或參考的物件,而不需要手動free(),字串的處理也靈活容易許多。

  • 物件導向 (Object-Oriented)

    • Java 是十分物件導向的語言,從設計的思維與程式的存取您都可以注意的到。任何一個程式都是一個類別(Class),包在不同的Package 中 (例如: System.out.println())。靈活的繼承機制與樣板讓物件導向之精神更為淋漓盡致

  • 安全(Secure)

    • 由於所有Java程式都需要執行在Java Virtual Machine(JVM),而Java Virtual Machine有以下特性:
      • 所有程式錯誤(Exception) 皆可處理也都需要處理
      • 不允許程式直接操作記憶體或使用指標進行探測
      • 可簽章驗證程式合法性
      • 類別載入器(Class loader)的階層架構設計,避免了載入惡意(Malicious)來源的類別

  • 多執行續(Multi-thread)

    • 您能透過實作(Implement)或延伸(Extend) Runner或Thread 的方式將您想要的Class 或程式變成一個Thread,故將您的程式變成多執行續是相當簡單的事情。

  • 跨平台(Platform-Independent)

    • 多數的程式語言都需要因不同的平台,不同的作業系統而使用目的平台的編譯器重新編譯原始碼,部分時候甚至需要修改。由於Java全部依賴JVM執行,故目標平台僅只需要有JVM可執行即可。而Java僅只將程式碼編譯為JVM虛擬執行碼給各JVM執行,達成一次編譯,多平台可用。

Java Virtual Machine (JVM)、Runtime Environment (JRE) 和 Development Kit (JDK) 的差別是什麼?:

這就得要說到電腦怎麼執行Java 語言了:
  • Java 原始碼 → [Javac (Java 編譯器)] → 二進位JVM虛擬機器碼 → [JVM執行] → [呼叫底層系統要執行的動作]

Java Virtual Machine (JVM) 就是這個執行JVM虛擬機器碼的程式,然而JVM仍然式個程式,一個能夠讀懂JVM虛擬機器碼然後告訴系統要怎麼執行的程式,如果沒有能夠系統互動的介面,那就只是一個斷手斷腳孤立而無用的中介軟體了,且系統平台十分的多樣,有不同的作業系統和硬體等等,所以這時候就有了Java Runtime Environment (JRE),也就是JVM 加上了與作業系統和硬體互動的介面,形成了一個能夠在這個作業系統或硬體環境上完整執行Java程式的環境,所以仔細注意的話可以發現,JRE有許多版本例如給Intel 64位元架構的Windows 作業系統使用的,或是ARM 64位元架構的Linux作業系統所使用的等等。這達成了Java 只要一次編譯隨處皆可用的優點,但缺點也在其中: 如果沒有人為這個平台重新編譯JRE的話,Java 應用程式就無法在這個平台上使用了。
那麼Java Development Kit (JDK)又是什麼呢 ? 為什麼開發Java 應用程式一定要安裝JDK呢 ? JDK與JRE可說是十分相似,最大的差別恐怕是在於javac (Java Compiler),沒有Javac,Java 程式碼就無法被轉換為JVM虛擬機器碼了,這便是需要安裝JDK的原因,而安裝了JDK還需要安裝JRE嗎? 答案是不需要的,JDK內部已經含有JRE。

OpenJDK 是什麼 ?

OpenJDK是一個範圍很大且定義不清楚的名詞,因為OpenJDK這個名詞可以是個泛稱軟體或機構、也可以是嚴格特定的指定某個軟體或機構。然而我們會以現在OpenJDK的說法來說明,過往以前的稱呼方法或方式我們也不再提及。

  • 預先編譯的OpenJDK(或各個OpenJDK發行版) – 各廠商或組織由http://hg.openjdk.java.net 提供的原始碼進行編譯,以安裝檔或zip的格式提供的JRE或JDK,有些廠商可能會提供支援選項
  • OpenJDK原始碼庫(或 OpenJDK專案) – Java 所有的核心功能與重要的函式庫原始碼全部都由http://hg.openjdk.java.net 管理與存放,而這些Java核心與重要函式庫都幾乎式從此而出。
  • 發行版 – Oracle’s OpenJDK(由Oracle 釋放的免費JDK發行版) – 由Oracle 編譯的OpenJDK發行版,與Oracle JDK不同的是,相較於其他發行版會對長期支援版持續性的提供更新,Oracle’s OpenJDK只更新最新版,一旦有更新的版本出現,舊的版本就停止維護。
  • Oracle JDK – 之前是對任何由Oracle 維護的Java JDK泛稱,而Java 12 之後為Oracle 提供商業用途的JDK (無免費版、可商業使用、有商業支援,持續更新),若有申請Oracle 的開發者帳號可免費取得,但不可使用於商業環境之中。

要使用OpenJDK的話我有多少選擇呢 ?

許多廠商都有提供其預先編譯的OpenJDK,您可以選擇您自己喜歡的來使用,以下為替您作的整理:

發行版 免編譯
授權費[1]
免發送
授權費[2]
延伸更新 商業支援
AdoptOpenJDK
Amazon Correctto
Azul Zulu
Bellsoft Liberica 未知
IBM Java
ojdkbuild
Oracle JDK 無[3]
Oracle OpenJDK
RedHat IcedTea
Sap SapMachine
各Linux Repo 請參照各規定
[1]: 商業使用該公司JDK進行Java程式編譯時不需要繳交授權費
[2]: 商業使用該公司JDK編譯出來的Java程式給予他人使用時不需要繳交授權費
[3]: Oracle 只對每個版本公眾支援六個月

為什麼不應該繼續選擇Oracle JDK ?

還記得Oracle 告Google 一案嗎 ? 至此之後Oracle 對於Java 的管理方式逐漸走向放棄這個賺不到錢的東西社群維護,而Oracle 只是其中一個成員。Oracle 也逐漸地不再免費提供Java更新,就以資訊安全的角度而言,這不是一個值得的好選擇。再加上Oracle 也逐漸地開始對使用Oracle JDK的公司以手段要求其付費更新,也不利於程式語言的普及化與發展。

是哪個組織實作的JRE或JDK對我的程式執行有影響嗎 ?

如果較為早期的版本確實會有非Oracle(或Sun) JDK執行效率較為不佳的問題,但Oracle 對於Java 的管理方式逐漸走向社群維護後,各組織與公司相繼投入的情況下這樣的差距是愈來愈小。

Java 有好多個版本,我應該要選擇哪一個 ?

Java 以相容性與特性可劃分為好幾個界線:

  • Java 4 ~ Java 7 (LTS): 是Java開始活絡的期間,但7已經逐漸的無人使用了。
  • Java 8 (LTS): 雖然仍然已經即將停止支援,但仍是主要使用的一群。
  • Java 9 ~ 現在: Java開始輕量化,變得更為效率靈活的一段期間,目前為Java 11是LTS版

雖然Java的語法都沒有什麼改變,但既然學習資訊,頻繁的世代更換是需要習慣的。

  • 我是新手,我擔心找不到資源: Java 8 LTS
  • 我對Java有初步的了解,也寫過一些: Java 11 LTS
  • 我想挑戰自己: Java 12

備註: LTS (Long-Term Support)長期支援版與一般Java不同的是,一般版本約六個月就會停止支援,LTS支援的時間往往是兩年或甚至更長。適用於需要穩定的環境,也較為建議使用。

示範安裝RedHat Java Development Kit:

1. 下載網址


https://developers.redhat.com/products/openjdk/download

請同學盡可能下載Long-Term Support 的版本,提供穩定一致的Java 環境,本範例使用Java 11 LTS作為安裝示範。更多說明請看上一章節: Java 好多個版本,我應該選哪一個。
請注意: 下載時可能會要求紅帽公司的帳號,可以自行註冊、諮詢助教或是使用其他公司所提供的JDK。


2. 安裝

安裝非常的簡單容易,就下一步到底即可,除了出現以下這個畫面時,請多注意這兩項RedHat 提供的貼心功能,讓安裝程式自動設定系統環境路徑。



3. 測試

開啟命令字元提示,輸入: javac -version。要跳出以下的畫面才算正確安裝,若出現找不到指令者,請注意PATH這個環境變數是否有包含JDK中JRE的執行目錄 (e.g. 11-0-3-jdk/bin)

4. 重新開機(一定要做)


Eclipse Java 整合式開發環境:

Eclipse 最初是IBM公司替商業軟體Visual Age for Java 開發的下一代整合是開發環境。2001年IBM將此工具貢獻給了開源社群,現在由Eclipse 基金會管理運作。Eclipse 十分彈性的架構與滿山滿谷的外掛工具支援,使得Eclipse 成為十分熱門的整合式開發環境(IDE)。而就以Top 10 IDE Index,2019年的五月,Eclipse 位居第二。

使用Eclipse 的優勢是什麼 ?:

相較於NetBeans 或IntelliJ 功能多樣而智慧化,Eclipse 顯得遜色了一些,但不否認的是Eclipse 使用人數眾多也讓各種問題的查詢輕鬆許多。


示範安裝Eclipse Java 整合式開發環境:

1. 下載網址


https://www.eclipse.org/downloads/

2. 安裝

Eclipse 安裝十分簡單,只是安裝程式啟動需要一點時間。完成後可以看到以下的畫面

選擇For Java Developer 或For Enterprise Java Developer 都可以。

選擇一個想要安裝Eclipse的地方就可以了(本例是C:\eclipse\)

期間會出現幾次的License Agreement,按下Accept 即可

3. 完成


按下Launch 就可以開始使用Eclipse,而安裝程式也會幫您在開始功能表與桌面建立捷徑

參考資料:

[1]: Difference between OpenJDK and AdoptOpenJDK, "https://stackoverflow.com/questions/52431764/difference-between-openjdk-and-adoptopenjdk," Stackoverflow.
[2]: Time to look beyond Oracle's JDK, "https://blog.joda.org/2018/09/time-to-look-beyond-oracles-jdk.html," Stephen Colebourne.
[3]: Java is Still Free 2.0.3, "https://medium.com/@javachampions/java-is-still-free-2-0-0-6b9aa8d6d244," Java Champions.
[4]: Java 語言的特性, "http://www.codedata.com.tw/book/java-basic/index.php?p=ch1-4," CodeData.
[5]: Java, "https://zh.wikipedia.org/wiki/Java," Wikipedia.
[6]: Eclipse, "https://zh.wikipedia.org/wiki/Eclipse," Wikipedia.
[7]: Top IDE Index, "https://pypl.github.io/IDE.html"

留言

熱門文章