【问题标题】:Autosuggestion on encrypted Data(AES-256 GCM Mode)加密数据的自动建议(AES-256 GCM 模式)
【发布时间】:2020-12-03 09:03:53
【问题描述】:

出于 PII 目的,我们正在加密电子邮件等数据库字段。

现在,对于完全匹配查询,我们还为字段保留散列形式 (HMAC)。 但是如何运行来自 Solr 的自动建议/来自 MySQL 的查询。

我的密码是

    public String encrypt(byte[] plaintext, byte[] dataKey, String version) throws Exception {
            long startTime = System.currentTimeMillis();
            // Generate Initialization Vector
            byte[] IV = generateIV();
    
            // Get Cipher Instance
            Cipher cipher = getCipher();
    
    
            // Store Version
            byte[] versionArr = new byte[3];
            versionArr = version.getBytes();
    
            // Generate Key
            SecretKeySpec keySpec = new SecretKeySpec(dataKey, "AES");
    
            // Create GCMParameterSpec
            GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(GCM_TAG_SIZE_BYTES * 8, IV);
    
            // Initialize Cipher for ENCRYPT_MODE
            cipher.init(Cipher.ENCRYPT_MODE, keySpec, gcmParameterSpec);
    
            // Perform Encryption
            byte[] cipherText = cipher.doFinal(plaintext);
    
        
            int capacity = 3  + GCM_IV_SIZE_BYTES + plaintext.length + GCM_TAG_SIZE_BYTES;
    
            // Create ByteBuffer & add IV & CipherText
            ByteBuffer buffer = ByteBuffer.allocate(capacity);
            buffer.put(versionArr);
            buffer.put(IV);
            buffer.put(cipherText);
            long endTime = System.currentTimeMillis();      
            
            // return the final encrypted cipher txt
            return Base64.getEncoder().encodeToString(buffer.array());
        }

private static byte[] generateIV() {
        final Random r = new SecureRandom();
        byte[] IV = new byte[GCM_IV_SIZE_BYTES];
        r.nextBytes(IV);

        return IV;
    }

    private static Cipher getCipher() {
        try {
            return Cipher.getInstance("AES/GCM/NoPadding");
        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
            e.printStackTrace();
        }
        return null;
    }

【问题讨论】:

    标签: aes-gcm


    【解决方案1】:

    简短的回答,有可能,但相当困难。

    长答案:

    散列的一个基本原理是散列变化很大,只需稍微改变输入,因此无法知道散列是否接近匹配输入值。 现在您可能认为将哈希输入到搜索引擎中可能会起作用,并且对标记器进行一些自定义(获取搜索输入并将其分成小部分以供引擎匹配的东西),这实际上会起作用。但是,您确实使反转哈希成为可能,让我解释一下:

    对于单个字段的自动完成,标记器将使用边 n-gram。这样做是将单个字符串拆分为可以完全匹配的多个标记,例如 john@gmail.com 将被拆分为:

    j, jo, joh, john, john@, ..., john@gmail.c, john@gmail.co, john@gmail.com

    现在搜索引擎可以搜索所有标记的精确匹配,并推荐最接近的匹配作为可能的值。

    如果您要自定义标记器,在存储之前对所有内容进行哈希处理,然后在搜索时输入,这绝对可行,但现在让我们看看当攻击者获取哈希标记化数据时会发生什么。

    在 john@gmail.com 的示例中,第一个存储的值将是 j 的哈希值,通过蛮力将需要几分之一秒的时间来反转。既然你现在知道第一个字母,那么第二个字母也会一样快,依此类推。在第一种情况下使用哈希的全部意义已过时。

    ps。带有盐的安全散列算法可能会起作用,但标记化几乎总是由搜索引擎完成,因此搜索引擎的计算部分必须是“安全的”

    来源:

    https://en.wikipedia.org/wiki/N-gram

    【讨论】:

      猜你喜欢
      • 2021-09-03
      • 1970-01-01
      • 2020-07-03
      • 2017-10-25
      • 2021-06-04
      • 2018-02-14
      • 2021-03-05
      • 1970-01-01
      相关资源
      最近更新 更多