最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java中的敏感信息處理

 更新時(shí)間:2025年01月08日 08:19:25   作者:jianzhangg  
平時(shí)開發(fā)中常常會(huì)遇到像用戶的手機(jī)號(hào)、姓名、身份證等敏感信息需要處理,這篇文章主要為大家整理了一些常用的方法,希望對(duì)大家有所幫助

平時(shí)開發(fā)中遇到像用戶的手機(jī)號(hào)、姓名、身份證等信息,在傳輸和入庫(kù)節(jié)點(diǎn),有以下常用的解決方案。

前后端傳輸

AES 對(duì)稱加密

對(duì)稱加密的加密和解密密鑰是同一個(gè),把密鑰放在前端,萬一被破解,有一定的風(fēng)險(xiǎn),不建議使用。

RSA 非對(duì)稱加密

提前生成一對(duì)公鑰和私鑰。

前端使用公鑰加密,公鑰是公開的,后端使用私鑰解密,私鑰放在配置中心不要寫在代碼里,只要后端私鑰不泄露,沒有任何問題。

RSA 加解密速度比較慢,超過 10KB 的數(shù)據(jù)就要分段,或者使用混合加密。

混合加密

在對(duì)大文件進(jìn)行加密時(shí),只使用 RSA 效率非常低,可以使用 RSA + AES 混合加密方式。

首先跟 RSA 步驟一樣,前端存儲(chǔ)公鑰,后端存儲(chǔ)私鑰。

然后前端隨機(jī)生成 AES 密鑰,使用 RSA 加密 AES 密鑰,再用 AES 加密大文件數(shù)據(jù)。

再把加密后 AES 密鑰和加密后的大文件數(shù)據(jù)一起傳給后端。

后端使用 RSA 解密 AES 密鑰,再用 AES 密鑰解密數(shù)據(jù)。

我這只用加密身份證、手機(jī)號(hào)等數(shù)據(jù),使用 RSA 非對(duì)稱加密即可。

數(shù)據(jù)庫(kù)加密

數(shù)據(jù)庫(kù)加密存儲(chǔ)要考慮到查詢效率和平時(shí)查 case 的便捷性。

MD5 + Salt/SHA + Salt

對(duì)用戶的密碼這種不需要解密的場(chǎng)景,可以用 SHA + Salt 方式加密。

由于彩虹表攻擊(窮舉 MD5 加密前后的數(shù)據(jù),例如網(wǎng)站上的 MD5 破解),MD5 已經(jīng)不那么安全了,尤其是沒有加鹽的時(shí)候,不再推薦使用。

AES 加密

以手機(jī)號(hào)為例,把手機(jī)號(hào)加密后無法使用手機(jī)號(hào)明文查詢,加的索引也是密文。

業(yè)務(wù)中會(huì)遇到通過手機(jī)號(hào)查詢、或批量查詢的場(chǎng)景,比如判斷用戶是否注冊(cè)過。

推薦使用 AES 加密,密鑰配在配置中心。

封裝額外的查詢接口,比如 getByPhone。

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> {

    private static final String SECRET_KEY = "your-encryption-key"; // 替換為你的加密密鑰

    /**
     * 根據(jù)明文手機(jī)號(hào)查詢單個(gè)用戶信息
     *
     * @param plainPhone 明文手機(jī)號(hào)
     * @return 匹配的用戶信息(數(shù)據(jù)庫(kù)密文解密后攜帶明文手機(jī)號(hào)信息)
     */
    public User getByPhone(String plainPhone) {
        // 1. 將明文手機(jī)號(hào)加密為密文
        String encryptedPhone = encryptPhone(plainPhone);

        // 2. 構(gòu)造查詢條件,通過密文匹配
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("encrypted_phone", encryptedPhone);

        // 3. 查詢并返回結(jié)果
        User user = this.getOne(queryWrapper);

        // 4. 注入明文手機(jī)號(hào)回傳,以便客戶端知道原來的手機(jī)號(hào)
        if (user != null) {
            user.setPlainPhone(plainPhone); // 假設(shè)實(shí)體類 User 里有這個(gè)字段
        }

        return user;
    }

    /**
     * 根據(jù)明文手機(jī)號(hào)列表查詢對(duì)應(yīng)的用戶信息
     *
     * @param plainPhones 明文手機(jī)號(hào)列表
     * @return 匹配的用戶信息列表(數(shù)據(jù)庫(kù)密文解密后攜帶明文手機(jī)號(hào)信息)
     */
    public List<User> listByPhoneIn(List<String> plainPhones) {
        // 1. 將明文手機(jī)號(hào)列表加密為密文列表
        List<String> encryptedPhones = plainPhones.stream()
                .map(this::encryptPhone) // 調(diào)用加密方法
                .collect(Collectors.toList());

        // 2. 構(gòu)造查詢條件,通過密文列表匹配
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("encrypted_phone", encryptedPhones);

        // 3. 查詢并返回結(jié)果
        List<User> users = this.list(queryWrapper);

        // 4. 將原始明文手機(jī)號(hào)與對(duì)應(yīng)的密文進(jìn)行綁定,注入到返回結(jié)果中
        for (User user : users) {
            // 找到與當(dāng)前密文匹配的明文手機(jī)號(hào)
            String plainPhone = plainPhones.get(encryptedPhones.indexOf(user.getEncryptedPhone()));
            user.setPlainPhone(plainPhone); // 假設(shè)實(shí)體類 User 里有這個(gè)字段
        }

        return users;
    }

    /**
     * 加密手機(jī)號(hào)的方法(對(duì)稱加密,AES)
     *
     * @param plainPhone 明文手機(jī)號(hào)
     * @return 加密密文手機(jī)號(hào)
     */
    private String encryptPhone(String plainPhone) {
        // 此處省略加密邏輯,可自行實(shí)現(xiàn) AES 加密對(duì)應(yīng)方法
        // 假設(shè)這里有一工具類調(diào)用 AES 加密,示例傳入密鑰和數(shù)據(jù)進(jìn)行加密
        return AESUtils.encrypt(plainPhone, SECRET_KEY); // 示例為偽代碼,請(qǐng)用實(shí)際工具實(shí)現(xiàn)
    }
}

case 查詢時(shí)可以用數(shù)據(jù)庫(kù) aes 加密查詢。

-- 查詢特定手機(jī)號(hào) 
SELECT * FROM users WHERE phone_encrypted = AES_ENCRYPT(plainPhone, SECRET_KEY);

不要直接使用 MySQL AES 解密查詢,這樣會(huì)掃全表解密比對(duì),數(shù)據(jù)庫(kù)坐等爆炸。

針對(duì)手機(jī)號(hào)這種特殊場(chǎng)景,還可以根據(jù)業(yè)務(wù)額外存前綴和后綴,方便范圍查詢。

如果對(duì)加密有更高的要求,可以在前后端和入庫(kù)時(shí)設(shè)置版本號(hào),定期修改 RSA 公私鑰和 AES 密鑰。

前端在通過接口獲取公鑰,后端把公私鑰存在數(shù)據(jù)庫(kù),附上版本號(hào)和生效日期。

后端解密時(shí),根據(jù)前端傳入的版本獲取對(duì)應(yīng)私鑰解密。

入庫(kù)時(shí)把版本號(hào)也存入,解密時(shí)通過版本號(hào)查詢密鑰再解密。

目前沒遇到要求這么高的場(chǎng)景,我計(jì)劃在前后端傳輸用 RSA 加密,入庫(kù)用 AES 加密,足以。

到此這篇關(guān)于詳解Java中的敏感信息處理的文章就介紹到這了,更多相關(guān)Java敏感信息處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)WAV音頻拼接徹底擺脫FFmpeg的輕量本地方案

    Java實(shí)現(xiàn)WAV音頻拼接徹底擺脫FFmpeg的輕量本地方案

    在音頻處理領(lǐng)域,FFmpeg 是幾乎無所不能的存在,從音頻解碼、格式轉(zhuǎn)換、拼接到混音,幾乎所有任務(wù)都能用一句命令完成,然而,正因?yàn)樗?也意味著笨重,本文給大家介紹了利用Java實(shí)現(xiàn)WAV音頻拼接徹底擺脫FFmpeg的輕量本地方案,需要的朋友可以參考下
    2025-11-11
  • java list 比較詳解及實(shí)例

    java list 比較詳解及實(shí)例

    這篇文章主要介紹了java list 比較詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • java 中同步、異步、阻塞和非阻塞區(qū)別詳解

    java 中同步、異步、阻塞和非阻塞區(qū)別詳解

    這篇文章主要介紹了java 中同步、異步、阻塞和非阻塞區(qū)別詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java中List集合去重方法以及效率對(duì)比

    Java中List集合去重方法以及效率對(duì)比

    這篇文章主要給大家介紹了關(guān)于Java中List集合去重方法以及效率對(duì)比的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • java線程之死鎖

    java線程之死鎖

    這篇文章主要介紹了Java線程之死鎖,死鎖是這樣一種情形-多個(gè)線程同時(shí)被阻塞,它們中的一個(gè)或者全部都在等待某個(gè)資源被釋放。由于線程被無限期地阻塞,因此程序不可能正常終止
    2022-05-05
  • Java實(shí)現(xiàn)年獸大作戰(zhàn)游戲詳解

    Java實(shí)現(xiàn)年獸大作戰(zhàn)游戲詳解

    春節(jié)要到了,看慣了前端各種小游戲,確實(shí)做得很好,很精致。本文將為大家介紹一款java版本的年獸大作戰(zhàn)游戲,感興趣的小伙伴可以試一試
    2022-01-01
  • java調(diào)用python腳本引入第三方庫(kù)失敗的實(shí)現(xiàn)

    java調(diào)用python腳本引入第三方庫(kù)失敗的實(shí)現(xiàn)

    本文主要介紹了java調(diào)用python腳本引入第三方庫(kù)失敗的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Spring Cloud Gateway不同頻率限流的解決方案(每分鐘,每小時(shí),每天)

    Spring Cloud Gateway不同頻率限流的解決方案(每分鐘,每小時(shí),每天)

    SpringCloud Gateway 是 Spring Cloud 的一個(gè)全新項(xiàng)目,它旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單有效的統(tǒng)一的 API 路由管理方式。這篇文章主要介紹了Spring Cloud Gateway不同頻率限流(每分鐘,每小時(shí),每天),需要的朋友可以參考下
    2020-10-10
  • Java使用EasyExcel模版導(dǎo)出詳細(xì)操作教程

    Java使用EasyExcel模版導(dǎo)出詳細(xì)操作教程

    業(yè)務(wù)中經(jīng)常需要按照一個(gè)特定的模板導(dǎo)出特定內(nèi)容,有些單元格還要求特殊的格式,所以下面這篇文章主要給大家介紹了關(guān)于Java使用EasyExcel模版導(dǎo)出的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • java設(shè)計(jì)模式系列之裝飾者模式

    java設(shè)計(jì)模式系列之裝飾者模式

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之裝飾者模式,裝飾者模式是一種結(jié)構(gòu)式模式,感興趣的朋友可以參考一下
    2016-02-02

最新評(píng)論

东乡县| 浏阳市| 苗栗市| 中宁县| 太白县| 论坛| 潍坊市| 鄱阳县| 池州市| 吉首市| 潍坊市| 越西县| 岫岩| 桂东县| 抚宁县| 太原市| 西峡县| 湾仔区| 江都市| 宁津县| 竹溪县| 陆丰市| 西和县| 搜索| 临城县| 望江县| 海宁市| 鄄城县| 霍林郭勒市| 肇州县| 沂南县| 图木舒克市| 盐边县| 松阳县| 侯马市| 金昌市| 屯昌县| 罗平县| 九江市| 正定县| 北海市|