【问题标题】:Search for encrypted text in database starts with or include string在数据库中搜索以字符串开头或包含字符串的加密文本
【发布时间】:2020-01-24 07:53:57
【问题描述】:

我只是在想是否可以在数据库中搜索以什么开头或包含一些字符或字符串的加密字段。

示例:

数据库中的加密文本:“7724bd4ae7cba2c8d182980c7889258b07be344a9c8892de3c303ae03677771c”

解密文本:“Jackey”

在 db 中搜索所有以什么开头的加密字段或包括:“Jac”

使用钠来加密/解密具有固定随机数的值(在示例中使用)

<?php

define("VALUE_ENCRYPTION_KEY", hex2bin("01abff4e1bbb9104e8e053bcc0492ad114ee7cbdc8597e4e5296e86c44a66bf0"));
define("VALUE_ENCRYPTION_NONCE", hex2bin('c1126da4358e7e4173f2ccc621dd1801a5949ae9f1896e43'));
define("VALUE_ENCRYPTION_BLOCK_SIZE", 16);

function EncryptValue($value)
{
    if (!empty($value)) {
        $padded_value = sodium_pad($value, VALUE_ENCRYPTION_BLOCK_SIZE);
        $encrypted_value = sodium_crypto_secretbox($padded_value, VALUE_ENCRYPTION_NONCE, VALUE_ENCRYPTION_KEY);

        return bin2hex($encrypted_value);
    } else {
        return null;
    }
}

function DecryptValue($value)
{
    if (!empty($value)) {
        $decrypted_padded_value = sodium_crypto_secretbox_open(hex2bin($value), VALUE_ENCRYPTION_NONCE, VALUE_ENCRYPTION_KEY);
        $decrypted_value = sodium_unpad($decrypted_padded_value, VALUE_ENCRYPTION_BLOCK_SIZE);
        return $decrypted_value;
    } else {
        return null;
    }
}

【问题讨论】:

    标签: php encryption filter sodium


    【解决方案1】:

    如果您获取所有值,解密它们,然后过滤它们:没问题,去吧。

    如果您想将所有这些内容导出到数据库:算了吧。正确加密的最重要原则之一是避免,尤其是该设置:如果我现在对明文的某些部分进行加密,并检查数据库中包含它的其他部分/从它开始。只需尝试逐个字符地加密一个字符串,看看加密后的字符串是如何变化的,不仅是微小的位,而且是完全的。

    但是您可以尝试以下方法:如果您总是想搜索给定、恒定长度的前缀(例如:始终是字符串的前三个、四个字符),请单独编码或散列它,然后存储它在一个单独的列中。这样就可以使用此列进行过滤

    【讨论】:

      猜你喜欢
      • 2014-05-21
      • 2020-09-08
      • 2019-10-11
      • 2011-05-25
      • 2014-10-15
      • 2017-01-08
      • 2020-05-24
      • 1970-01-01
      • 2021-06-12
      相关资源
      最近更新 更多