日韩欧美人妻无码精品白浆,www.大香蕉久久网,狠狠的日狠狠的操,日本好好热在线观看

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

你是怎么實現(xiàn)數(shù)據(jù)庫加密數(shù)據(jù)的模糊查詢的

admin
2025年6月13日 20:18 本文熱度 124

做過金融項目或者政府項目的大佬肯定都實現(xiàn)過加密數(shù)據(jù)的模糊查詢功能,大家都是怎么實現(xiàn)的呢?今天就來簡單舉例一些實現(xiàn)加密數(shù)據(jù)模糊查詢的方案。
方案
查詢效率
開發(fā)成本
安全性
適用場景
應(yīng)用層內(nèi)存過濾
? 極差
? 低
? 高
極小數(shù)據(jù)量
數(shù)據(jù)庫函數(shù)解密
????
????
? 低
內(nèi)部低安全需求
分詞+密文索引
????????
??????
? 高
大多數(shù)業(yè)務(wù)場景
同態(tài)加密
? 差
????????
? 高
學(xué)術(shù)研究/高安全
可信執(zhí)行環(huán)境(TEE)
??????
????????
? 高
金融級安全

方案1:應(yīng)用層內(nèi)存過濾

原理

  1. 全表查詢加密數(shù)據(jù)

  2. 在內(nèi)存中解密后過濾

// 偽代碼示例:危險!僅用于演示問題public List<UserunsafeSearch(String keyword) {    List<User> allUsers = userRepository.findAll(); // 查出全部數(shù)據(jù)    return allUsers.stream()            .filter(user -> decrypt(user.getName()).contains(keyword))            .collect(Collectors.toList());}

致命缺陷

  • 數(shù)據(jù)量大時內(nèi)存溢出(OOM)

  • 全表掃描性能災(zāi)難


方案2:數(shù)據(jù)庫函數(shù)解密

MySQL示例

-- 使用AES_DECRYPT函數(shù)(需數(shù)據(jù)庫存儲密鑰)SELECT * FROM users WHERE AES_DECRYPT(name_encrypted, 'secret_key'LIKE '%張%';

優(yōu)缺點

  • ? 不改動業(yè)務(wù)代碼

  • ? 密鑰暴露在數(shù)據(jù)庫

  • ? 無法使用索引(全表掃描)

Java安全寫法

@Query(nativeQuery = true,       value = "SELECT * FROM users WHERE " +               "CONVERT(AES_DECRYPT(name_encrypted, ?1) USING utf8) LIKE ?2")List<UsersearchByName(String key, String keyword);


方案3:分詞+密文索引(推薦)

1. 核心思路

  • 存儲階段
    將原始數(shù)據(jù)(如"張三豐")拆分為分詞("張"、"三"、"豐"、"張三"、"三豐"),每個分詞加密后單獨(dú)存儲。

  • 查詢階段
    用戶輸入"張"時,先加密"張"得到密文,再用密文去分詞索引表查詢。

2. 代碼實現(xiàn)

(1). 增強(qiáng)版分詞策略

// 引入中文分詞器(需添加依賴)<dependency>    <groupId>com.janeluo</groupId>    <artifactId>ikanalyzer</artifactId>    <version>2012_u6</version></dependency>
public class EnhancedTokenizer {    public static List<StringsmartTokenize(String text) {        List<String> tokens = new ArrayList<>();        try (StringReader reader = new StringReader(text)) {            IKSegmenter seg = new IKSegmenter(reader, true);            Lexeme lex;            while ((lex = seg.next()) != null) {                tokens.add(lex.getLexemeText());                // 增加組合分詞(如"張三豐"生成"張"、"三"、"豐"、"張三"、"三豐")                if (lex.getLength() > 1) {                    for (int i = 2; i <= lex.getLength(); i++) {                        tokens.add(text.substring(lex.getBeginPosition(),                                 lex.getBeginPosition() + i));                    }                }            }        }        return tokens.stream().distinct().collect(Collectors.toList());    }}

2. 雙重加密索引表

// 索引表結(jié)構(gòu)建議@Entity@Table(name = "user_search_index")public class SearchIndex {    @Id    @GeneratedValue    private Long id;
    @Column(name = "user_id")    private Long userId;
    @Column(name = "token_hash")  // 用于快速匹配    private String tokenHash;
    @Column(name = "token_cipher") // 用于精確驗證    private String tokenCipher;
    // 使用不同密鑰加密    public static SearchIndex create(Long userId, String token) throws Exception {        SearchIndex index = new SearchIndex();        index.setUserId(userId);        index.setTokenHash(AESUtil.encryptWithKey(token, "HASH_KEY"));        index.setTokenCipher(AESUtil.encryptWithKey(token, "CIPHER_KEY"));        return index;    }}

3. 智能查詢流程

public List<UsersecureFuzzySearch(String keyword) throws Exception {    // 1. 生成候選分詞    List<String> tokens = EnhancedTokenizer.smartTokenize(keyword);
    // 2. 并行加密提高性能    List<String> hashList = tokens.parallelStream()            .map(t -> {                try {                    return AESUtil.encryptWithKey(t, "HASH_KEY");                } catch (Exception e) {                    throw new RuntimeException(e);                }            })            .collect(Collectors.toList());
    // 3. 分頁查詢避免內(nèi)存壓力    Pageable page = PageRequest.of(0100);    List<Long> userIds = indexRepository            .findUserIdsByTokenHashes(hashList, page);
    // 4. 二次驗證(防止哈希碰撞)    return userRepository.findAllById(userIds).stream()            .filter(user -> {                try {                    String decrypted = AESUtil.decrypt(user.getNameCipher());                    return decrypted.contains(keyword);                } catch (Exception e) {                    return false;                }            })            .collect(Collectors.toList());}


方案4:同態(tài)加密(學(xué)術(shù)級方案)

基于SEAL庫的實現(xiàn)

// 添加依賴(微軟SEAL庫Java版)<dependency>    <groupId>com.microsoft.seal</groupId>    <artifactId>seal-jni</artifactId>    <version>3.7.2</version></dependency>
public class HomomorphicSearch {    public static void demo() throws Exception {        // 1. 初始化加密上下文        EncryptionParameters params = new EncryptionParameters(SchemeType.bfv);        params.setPolyModulusDegree(4096);        params.setCoeffModulus(CoeffModulus.BFVDefault(4096));        params.setPlainModulus(PlainModulus.Batching(409620));
        SEALContext context = new SEALContext(params);
        // 2. 生成密鑰        KeyGenerator keyGen = new KeyGenerator(context);        PublicKey publicKey = keyGen.createPublicKey();        SecretKey secretKey = keyGen.secretKey();
        // 3. 加密數(shù)據(jù)        Encryptor encryptor = new Encryptor(context, publicKey);        Plaintext plain = new Plaintext("123"); // 要加密的數(shù)字        Ciphertext encrypted = new Ciphertext();        encryptor.encrypt(plain, encrypted);
        // 4. 在密文上計算(此處演示加法)        Evaluator evaluator = new Evaluator(context);        Ciphertext result = new Ciphertext();        evaluator.add(encrypted, encrypted, result); // 密文+密文
        // 5. 解密驗證        Decryptor decryptor = new Decryptor(context, secretKey);        Plaintext decrypted = new Plaintext();        decryptor.decrypt(result, decrypted);        System.out.println(decrypted); // 應(yīng)輸出246    }}

現(xiàn)實限制

  • 僅支持有限運(yùn)算(加減/乘)

  • 性能差(單次操作需100ms+)

  • 不支持字符串操作


方案5:可信執(zhí)行環(huán)境(TEE)

基于Intel SGX的解決方案

// SGX加密區(qū)(enclave)內(nèi)代碼示例void ecall_fuzzy_search(const char* encrypted_query, size_t len) {    // 1. 解密查詢條件    std::string query = decrypt_in_enclave(encrypted_query, len);
    // 2. 直接查詢數(shù)據(jù)庫(enclave內(nèi)可見明文)    sqlite3* db;    sqlite3_open(":memory:", &db);    std::string sql = "SELECT * FROM users WHERE name LIKE '%" + query + "%'";
    // 3. 加密結(jié)果返回    encrypt_results(db_exec(sql));}

優(yōu)勢

  • 硬件級安全

  • 性能接近明文查詢
    挑戰(zhàn)

  • 需要特定硬件支持

  • 開發(fā)復(fù)雜度高


閱讀原文:原文鏈接


該文章在 2025/6/14 16:36:35 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊、財務(wù)費(fèi)用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

欧美精品二,三区| 国产激情久久久久影院老熟女3D| 久久久精品视频69| 亚洲激情图片网址| 麻豆三区在线免费观看| 99成年精品视频| 精语一区二区| 欧美乱伦有码一区二区| 日韩按模一区二区三区| 操你了香蕉| 欧美激情亚洲88| 深爱五月最新综合网站| 精品无码一区二区三区麻豆网| 欧美亚洲日韩图区| 男女日B网站免费看| 日韩欧美亚洲综合久久影院d1| 91精彩国产视频| 大师av在线| 九九黄色网址| 中文字幕一区二区久久五月天| 艹视频在线免费看| 九九久久黄色| 男人日女人视频流出| 中文字幕伦乱一区| 91日日日日日| 日韩+欧美+亚洲| 亚洲精品ip| 两性爱爱av| 首页123操逼| 草视频在线精品视频| 日本五月天高清| 在线自偷自拍| 久久美女很黄很黄| 日本性爱一区二区久久| 亚洲天堂网www| 国产视频日B视频精品| 午夜视频欧美日韩| 加勒比青青久久综合| 色婷婷久久网| 午夜极品福利视频| 久久久久久久久94|