繁体   English   中英

在数据库中搜索加密文本以字符串开头或包含字符串

[英]Search for encrypted text in database starts with or include string

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

例子:

数据库中的加密文本:“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;
    }
}

如果您获取了所有值,对其进行解密,然后对其进行过滤:没问题,继续。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM