首頁 > 軟體

專案適 Oracle改造及SSL安全性設定問題彙總詳解

2022-10-02 14:01:37

背景

專案開發初期使用 MySQL ,後期需要適配 Oracle ,總結適配過程及多資料庫支援時,從開發初期就需要考慮的幾點。

另外,總結幾點最近半年開發過程中的技術問題。坑都填了,也該是時候記錄一下填坑的經過了,要不然下次可能還會踏入同一個坑。

Oracle 適配點

  • 表名稱長度限制,支援 Oracle 12C 以下是需要考慮 30個字元的限制。
  • Oracle 關鍵字 USER 不能亂用做別名.跟 MySQL 不一樣,Oracle 有一張特殊的使用者表名稱就是 USER
  • Oracle 沒有預設跳脫符號,支援模糊查詢時,需要手動編寫查詢語句指定 ESCAPE 字元。這點 MyBatisPlus 外掛的模糊查詢愛莫能助,所以還是需要自定義模糊查詢 SQL。好在 MySQL 和 Oracle 的 ESCAPE 語法是是一樣的,可以統一。此外字串連線函數 CONCAT 也應該以 Oracle 為主,只能有兩個引數。
  • Oracle 的欄位長度,一箇中文的長度是2,這點與 MySQL 不一樣。可變長度、允許輸入中文的欄位,都需要自動擴大到 MySQL 的 2 倍長。
  • Oracle 的 null 值插入或者更新時的異常問題,可以通過 MyBatisPlus 的全域性設定 jdbc-type-for-null: 'null' 統一解決。
  • Oracle 區分大小寫的,SQL 語法中注意小寫是否真的是小寫,如果是,需要加引號跳脫。
  • MySQL 的 text 或者 LongText 欄位,對應 NCLOB VS VARCHAR(4000),有些特殊欄位需要超長字元的,有個四千的邊界,超過就需要用 NCLOB 型別。

其他低階錯誤

有些低階錯誤,比如:

  • yml 設定冒號後面要有空格,特殊字元用單引號。
  • IDEA 將普通 Java 工程匯出可執行 jar 的時候,MANTIFET 清單檔案生成的目錄必須放在 src 下面,否則打包生成的檔案執行時找不到主類。
  • 迭代器遍歷的正確用法是 while(it.hasNext) 而非 if ,後者只會執行一次。再次印證了一句經驗:不要相信拷貝來的程式碼,除非經過了你的測試。
  • 精度丟失問題,一個簡單的計算指定週期的時間戳的程式碼,未考慮精度問題而溢位:
long result = 0;
switch (type){
case "year":
 result = time*365*24*60*60*1000;
  break;
case "month":
  result = time*30*24*60*60*1000;
  break;
case "day":
  result = time*24*60*60*1000;
  break;
  }

這個簡單的根據時間單位型別,計算間隔的時間戳的程式碼, time 型別傳入了 int ,結果幾個純數值預設 int 相乘後,單位為 year 結果溢位為負數了。

這是一個計算密碼鎖定時間的功能,鎖定時間算出為負了,當密碼正確時自動判斷是否繼續鎖定時,當前時間 > (鎖定開始時間+鎖定時常)直接解鎖了。

這個錯誤雖然低階,但是卻測不出來,只有腦回路清奇的測試把密碼鎖定策略的鎖定週期設定為年時才會顯現。

高階問題

Web 專案安全掃描,https 支援的過程中,預設的 ssl 設定被掃到了不安全的密碼套件和金鑰長度過短的問題。Spring Boot 專案設定 SSL ,在目標伺服器設定後 ciphers 密碼套件後,存取不成功,總結一下這個過程。

相關的 SSL 設定:

ssl:
    enabled: false
    key-store: file:xxx.jks
    key-store-type: JKS
    key-alias: xxx
    key-store-password: xxx
    # 設定證書版本,預設是 TLS1.0
    protocol: TLS
    # 設定SSL版本,預設是 TLS1.0
    enabled-protocols: TLSv1.2
    # 金鑰套件演演算法,剔除不安全的演演算法
    ciphers: TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

需要注意的是,ciphers 引數中的密碼演演算法對 JDK 版本有要求,較低的1.8 小版本是不支援的。

工具思維

有一臺伺服器的 SFTP 服務設定連線時間很短,由於網路問題,FTP 使用者端總是沒法在30秒內完成連線。但是碰到需要上傳檔案的時候,怎麼辦呢?

找別人上傳了兩次之後,總不能每次都找別人幫忙上傳吧。試了下 Java 的 FTP 上傳工具類,jsch 竟然能成功上傳。一個簡單的工具類,就成了縮減版的 FTP 工具了。

開發啟示錄

啟示一,協同開發過程中,如果你看到了確實是問題的異常,拋在開發溝通群裡,不能指望真正負責這個模組的人會主動解決這個問題。最好的方法是 @他 並明確告訴他有問題。否則,下次這個問題復現的時候,還是會再次面對的。

啟示二,再次反思,拷貝程式碼要測試。

以上就是專案適 Oracle改造及SSL安全性設定問題彙總詳解的詳細內容,更多關於Oracle改造SSL安全適配的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com