0

我只是在考虑是否可以在数据库中搜索以开头或包含某些字符或字符串的加密字段。

例子:

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

解密文本:“杰基”

在 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;
    }
}
4

1 回答 1

3

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

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

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

于 2020-01-24T08:04:22.130 回答