項(xiàng)目適 Oracle改造及SSL安全性配置問(wèn)題匯總詳解
目錄
- 背景
- Oracle 適配點(diǎn)
- 其他低級(jí)錯(cuò)誤
- 高級(jí)問(wèn)題
- 工具思維
- 開(kāi)發(fā)啟示錄
背景
項(xiàng)目開(kāi)發(fā)初期使用 MySQL ,后期需要適配 Oracle ,總結(jié)適配過(guò)程及多數(shù)據(jù)庫(kù)支持時(shí),從開(kāi)發(fā)初期就需要考慮的幾點(diǎn)。
另外,總結(jié)幾點(diǎn)最近半年開(kāi)發(fā)過(guò)程中的技術(shù)問(wèn)題。坑都填了,也該是時(shí)候記錄一下填坑的經(jīng)過(guò)了,要不然下次可能還會(huì)踏入同一個(gè)坑。
Oracle 適配點(diǎn)
- 表名稱(chēng)長(zhǎng)度限制,支持 Oracle 12C 以下是需要考慮 30個(gè)字符的限制。
- Oracle 關(guān)鍵字
USER
不能亂用做別名.跟 MySQL 不一樣,Oracle 有一張?zhí)厥獾挠脩?hù)表名稱(chēng)就是USER
。 - Oracle 沒(méi)有默認(rèn)轉(zhuǎn)義符號(hào),支持模糊查詢(xún)時(shí),需要手動(dòng)編寫(xiě)查詢(xún)語(yǔ)句指定 ESCAPE 字符。這點(diǎn) MyBatisPlus 插件的模糊查詢(xún)愛(ài)莫能助,所以還是需要自定義模糊查詢(xún) SQL。好在 MySQL 和 Oracle 的
ESCAPE
語(yǔ)法是是一樣的,可以統(tǒng)一。此外字符串連接函數(shù)CONCAT
也應(yīng)該以 Oracle 為主,只能有兩個(gè)參數(shù)。 - Oracle 的字段長(zhǎng)度,一個(gè)中文的長(zhǎng)度是2,這點(diǎn)與 MySQL 不一樣。可變長(zhǎng)度、允許輸入中文的字段,都需要自動(dòng)擴(kuò)大到 MySQL 的 2 倍長(zhǎng)。
- Oracle 的 null 值插入或者更新時(shí)的異常問(wèn)題,可以通過(guò) MyBatisPlus 的全局配置
jdbc-type-for-null: 'null'
統(tǒng)一解決。 - Oracle 區(qū)分大小寫(xiě)的,SQL 語(yǔ)法中注意小寫(xiě)是否真的是小寫(xiě),如果是,需要加引號(hào)轉(zhuǎn)義。
- MySQL 的 text 或者 LongText 字段,對(duì)應(yīng)
NCLOB
VSVARCHAR(4000)
,有些特殊字段需要超長(zhǎng)字符的,有個(gè)四千的邊界,超過(guò)就需要用NCLOB
類(lèi)型。
其他低級(jí)錯(cuò)誤
有些低級(jí)錯(cuò)誤,比如:
- yml 配置冒號(hào)后面要有空格,特殊字符用單引號(hào)。
- IDEA 將普通 Java 工程導(dǎo)出可執(zhí)行 jar 的時(shí)候,MANTIFET 清單文件生成的目錄必須放在 src 下面,否則打包生成的文件執(zhí)行時(shí)找不到主類(lèi)。
- 迭代器遍歷的正確用法是
while(it.hasNext)
而非 if ,后者只會(huì)執(zhí)行一次。再次印證了一句經(jīng)驗(yàn):不要相信拷貝來(lái)的代碼,除非經(jīng)過(guò)了你的測(cè)試。 - 精度丟失問(wèn)題,一個(gè)簡(jiǎn)單的計(jì)算指定周期的時(shí)間戳的代碼,未考慮精度問(wèn)題而溢出:
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; }
這個(gè)簡(jiǎn)單的根據(jù)時(shí)間單位類(lèi)型,計(jì)算間隔的時(shí)間戳的代碼, time
類(lèi)型傳入了 int
,結(jié)果幾個(gè)純數(shù)值默認(rèn) int 相乘后,單位為 year
結(jié)果溢出為負(fù)數(shù)了。
這是一個(gè)計(jì)算密碼鎖定時(shí)間的功能,鎖定時(shí)間算出為負(fù)了,當(dāng)密碼正確時(shí)自動(dòng)判斷是否繼續(xù)鎖定時(shí),當(dāng)前時(shí)間 > (鎖定開(kāi)始時(shí)間+鎖定時(shí)常)直接解鎖了。
這個(gè)錯(cuò)誤雖然低級(jí),但是卻測(cè)不出來(lái),只有腦回路清奇的測(cè)試把密碼鎖定策略的鎖定周期設(shè)置為年時(shí)才會(huì)顯現(xiàn)。
高級(jí)問(wèn)題
Web 項(xiàng)目安全掃描,https 支持的過(guò)程中,默認(rèn)的 ssl 配置被掃到了不安全的密碼套件和密鑰長(zhǎng)度過(guò)短的問(wèn)題。Spring Boot 項(xiàng)目配置 SSL ,在目標(biāo)服務(wù)器配置后 ciphers
密碼套件后,訪(fǎng)問(wèn)不成功,總結(jié)一下這個(gè)過(guò)程。
相關(guān)的 SSL 配置:
ssl: enabled: false key-store: file:xxx.jks key-store-type: JKS key-alias: xxx key-store-password: xxx # 配置證書(shū)版本,默認(rèn)是 TLS1.0 protocol: TLS # 設(shè)置SSL版本,默認(rèn)是 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 參數(shù)中的密碼算法對(duì) JDK 版本有要求,較低的1.8 小版本是不支持的。
工具思維
有一臺(tái)服務(wù)器的 SFTP 服務(wù)配置連接時(shí)間很短,由于網(wǎng)絡(luò)問(wèn)題,F(xiàn)TP 客戶(hù)端總是沒(méi)法在30秒內(nèi)完成連接。但是碰到需要上傳文件的時(shí)候,怎么辦呢?
找別人上傳了兩次之后,總不能每次都找別人幫忙上傳吧。試了下 Java 的 FTP 上傳工具類(lèi),jsch 竟然能成功上傳。一個(gè)簡(jiǎn)單的工具類(lèi),就成了縮減版的 FTP 工具了。
開(kāi)發(fā)啟示錄
啟示一,協(xié)同開(kāi)發(fā)過(guò)程中,如果你看到了確實(shí)是問(wèn)題的異常,拋在開(kāi)發(fā)溝通群里,不能指望真正負(fù)責(zé)這個(gè)模塊的人會(huì)主動(dòng)解決這個(gè)問(wèn)題。最好的方法是 @他 并明確告訴他有問(wèn)題。否則,下次這個(gè)問(wèn)題復(fù)現(xiàn)的時(shí)候,還是會(huì)再次面對(duì)的。
啟示二,再次反思,拷貝代碼要測(cè)試。
以上就是項(xiàng)目適 Oracle改造及SSL安全性配置問(wèn)題匯總詳解的詳細(xì)內(nèi)容,更多關(guān)于Oracle改造SSL安全適配的資料請(qǐng)關(guān)注其它相關(guān)文章!
