日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

解决 IDEA 调用其他类的时候自动加上包路径和类名的情况_惊呆了!不改一行 Java 代码竟然就能轻松解决敏感信息加解密...

發(fā)布時(shí)間:2024/1/23 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解决 IDEA 调用其他类的时候自动加上包路径和类名的情况_惊呆了!不改一行 Java 代码竟然就能轻松解决敏感信息加解密... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

出于安全考慮,現(xiàn)需要將數(shù)據(jù)庫的中敏感信息加密存儲(chǔ)到數(shù)據(jù)庫中,但是正常業(yè)務(wù)交互還是需要使用明文數(shù)據(jù),所以查詢返回我們還需要經(jīng)過相應(yīng)的解密才能返回給調(diào)用方。

?

ps:日常開發(fā)中,我們要有一定的安全意識(shí),對(duì)于密碼,金融數(shù)據(jù)等敏感信息進(jìn)行加密存儲(chǔ)保護(hù)。

?

這個(gè)需求說起來不是很難,我們只需要在執(zhí)行 sql 之前,提前將指定數(shù)據(jù)進(jìn)行加密。執(zhí)行 sql 之后,獲取返回結(jié)果,再進(jìn)行的相應(yīng)的解密。稍微改造下原有代碼,很快完成需求。

?

現(xiàn)有加密算法如 RSA2 ,AES 等,密文長度將會(huì)是明文好幾倍。上線加解密方案一定要評(píng)估數(shù)據(jù)庫現(xiàn)有字段長度是否滿足加密之后長度。

?

如果這是一張新建的表,上面的實(shí)現(xiàn)方案并沒有什么問題。但是這次我們改造是幾張已有已有「千萬級(jí)」的存量的數(shù)據(jù)的表,這些數(shù)據(jù)都未被加密存儲(chǔ)。

如果使用上述代碼,使用加密之后的密文信息查詢歷史數(shù)據(jù),當(dāng)然查詢不到任何結(jié)果。另外當(dāng)查詢返回的結(jié)果是明文,解密明文數(shù)據(jù)庫也可能會(huì)導(dǎo)致相應(yīng)的解密錯(cuò)誤。

所以為了兼容歷史數(shù)據(jù),需要進(jìn)行如下改造:

  • 增加新字段存放對(duì)應(yīng)的加密數(shù)據(jù),sql 等值條件查詢修改成 in 查詢
  • 查詢返回的記錄首先判斷是否是密文,如果是密文再去解密

代碼改造如下:

上述代碼雖然解決業(yè)務(wù)需求,但是這個(gè)解決方案不是很優(yōu)雅,業(yè)務(wù)代碼改動(dòng)較大,加解密的代碼不能通用,所有涉及到相關(guān)字段的方法都需要改動(dòng),且?guī)缀醵际侵貜?fù)代碼,代碼侵入性很強(qiáng),不是很友好。

有經(jīng)驗(yàn)的同學(xué)可能會(huì)想到使用 Spring AOP 解決上述問題。

在切面的前置方法「beforeMethod」統(tǒng)一攔截查詢參數(shù),配合自定義的注解,加密指定的字段。

然后在切面的后置方法「afterReturn」攔截返回值,配合自定義注解,解密指定的字段。

?

Spring AOP 代碼實(shí)現(xiàn)比較復(fù)雜,這里就不貼出具體的代碼。

?

但是 Spring AOP 方案也并不通用,如果其他的應(yīng)用也有相同的需求,同樣的代碼,又需要重復(fù)實(shí)現(xiàn),還是很費(fèi)時(shí)費(fèi)力。

最終我們參考一個(gè) github 開源項(xiàng)目「typehandlers-encrypt」,借助 mybatis 的?「TypeHandler」,實(shí)現(xiàn)通用的數(shù)據(jù)加解密解決方案。使用方只需要引入相關(guān)依賴,「無需改動(dòng)一行業(yè)務(wù)代碼」,僅需少量配置即可實(shí)現(xiàn)指定字段加解密操作,省時(shí)省力。

?

「typehandlers-encrypt」?github 地址:https://github.com/drtrang/typehandlers-encrypt

?

實(shí)現(xiàn)原理

mybatis 利用內(nèi)置類型轉(zhuǎn)換器(「typeHandler」),實(shí)現(xiàn) Java 類型與 JDBC 類型的相互轉(zhuǎn)換,我們正好可以利用這個(gè)特性,在轉(zhuǎn)換之前加入加解密步驟。

typeHandler?底層原理不是復(fù)雜,如果我們沒有使用 Mybatis,而是直接使用最原始的 JDBC 執(zhí)行查詢語句,相關(guān)代碼如下:

JDBC

我們需要手動(dòng)判斷 Java 類型,然后調(diào)用?PreparedStatement設(shè)置合適類型參數(shù)。獲取返回結(jié)果之后,又需要手動(dòng)調(diào)用?ResultSet?結(jié)果集獲取相應(yīng)類型的數(shù)據(jù),這個(gè)過程十分繁瑣。

使用 mybatis 之后,上述步驟就無需我們?cè)賹?shí)現(xiàn)了。mybatis 可以通過識(shí)別 Java/JDBC 類型,調(diào)用相應(yīng)typeHandler,自動(dòng)實(shí)現(xiàn)轉(zhuǎn)換邏輯。

下圖為 mybatis 內(nèi)置類型轉(zhuǎn)換器,基本涵蓋了所有?「Java/JDBC」?數(shù)據(jù)類型。

通用解決方案

自定義 typeHandler

下面我們來實(shí)現(xiàn)帶有加解密功能的類型轉(zhuǎn)換器,實(shí)現(xiàn)方式也比較簡(jiǎn)單,只要繼承?org.apache.ibatis.type.BaseTypeHandler,重寫相關(guān)方法。

?

簡(jiǎn)單起見,上述加解密僅使用了 Base64,大家可以替換成相應(yīng)加解密算法即或者引入相應(yīng)加解密服務(wù)。

?

其中加密轉(zhuǎn)換將在?setNonNullParameter?中執(zhí)行,解密轉(zhuǎn)換將在?getNullableResult中執(zhí)行。

CryptTypeHandler?使用一個(gè)?MappedTypes?注解,包含一個(gè)?CryptType?類,這個(gè)類使用 mybatis 別名功能,可以極大簡(jiǎn)化 sqlmap 相關(guān)配置。

alias

注冊(cè) typeHandler

使用方必須將?typeHandler?和?alias?注冊(cè)到 mybatis 中,否則無法生效。

下面提供三種方式,可以根據(jù)項(xiàng)目情況選擇其中一種即可:

「單獨(dú)使用 mybatis」

這種場(chǎng)景需要在?「mybatis-config.xml」?配置,mybatis 啟動(dòng)時(shí)將會(huì)加載該配置文件。

<typeHandlers>

「使用 Spring 配置 Mybatis Bean」

配合 Spring 使用時(shí)需要將?typeHandler?注入?SqlSessionFactoryBean?,配置方式如下:

「SpringBoot」

SpringBoot 方式就最簡(jiǎn)單了,只要引入?mybatis-starter,配置文件加入如下配置即可:

## mybatis 配置
# 類型轉(zhuǎn)換器包路徑
mybatis.type-handlers-package=com.xx.xx.x
mybatis.type-aliases-package=com.xx.xx

修改 mapper sql 配置

最后我們只要簡(jiǎn)單修改 mapper 中?resultMap?或 sql s配置就可以實(shí)現(xiàn)加解密。

假設(shè)我們對(duì)現(xiàn)有一張?「bank_card」?表進(jìn)行加解密,表結(jié)構(gòu)如下:

CREATE?

「insert 加密」

現(xiàn)需要對(duì)?card_no,phone,name,id_no?進(jìn)行加密,「insert」?語句加密示例:

<insert?id="insertBankCard"?keyProperty="id"?useGeneratedKeys="true"?parameterType="org.demo.pojo.BankCardDO">

我們只需要在?「#{}」?指定 typeHandler,傳入?yún)?shù)最后將被加密。使用?typeHandler需要使用類的全路徑,比較繁瑣,我們可以使用?「javaType」?屬性,直接使用上面我們的定義別名?「crypt」

數(shù)據(jù)庫最終執(zhí)行sql 如下:

INSERT??

ps:推薦一款 IDEA 的插件?「mybatis-log-plugin」,可以自動(dòng)將 mybatis sql 日志還原成真實(shí)執(zhí)行 sql

?

「查詢加解密」

普通查詢解密示例如下:

<resultMap?id="bankCardXml"?type="org.demo.pojo.BankCardDO">

這里我們?cè)?「select」?配置中只能使用?resultMap?屬性,指定?typeHandler?。

數(shù)據(jù)庫明文、密文共存的情況,查詢解密示例如下:

最后我們可以將自定義的?typeHandler?單獨(dú)打包發(fā)布,其他業(yè)務(wù)方只需要引用,改造相關(guān)配置文件,即可完成數(shù)據(jù)加解密。

上述代碼示例已上傳至 Github,地址:https://github.com/9526xu/mybatis-encrypt

總結(jié)

借助于自定義的?typeHandler,我們實(shí)現(xiàn)了一個(gè)通用的加解密的方案,該方案對(duì)于使用方來說代碼侵入性小,開箱即用,可以快速完成加解密的改造。

?

ps:你們是否也有遇到同樣的需求,可以在下方留言寫下你們的方案,互相學(xué)習(xí),一起成長!

?

最后感謝一下**@輝哥**提供解決思路。

Reference

  • https://github.com/9526xu/mybatis-encrypt
  • https://github.com/drtrang/typehandlers-encrypt
  • 最后說一句(求關(guān)注)

    看到這里,想必大家都累了,放一張趣圖輕松一下。

    當(dāng)你在 github 提交相關(guān) issue 期待其他人回答解答問題時(shí)

    ?往期推薦?

    🔗

    • Docker搭建RocketMQ,1分鐘不到,應(yīng)該是史上最快最便捷的方法
    • 我的天,你工作5年了,連Java agent都不知道...
    • 面試官:為什么代碼規(guī)范要求SQL語句不要過多的join?

    ?

    點(diǎn)擊

    總結(jié)

    以上是生活随笔為你收集整理的解决 IDEA 调用其他类的时候自动加上包路径和类名的情况_惊呆了!不改一行 Java 代码竟然就能轻松解决敏感信息加解密...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。