【问题标题】:Encryption: how to have 1 iv despite multiple fields加密:尽管有多个字段,如何拥有 1 iv
【发布时间】:2009-11-06 14:17:32
【问题描述】:

一段时间以来,我一直在努力寻找最佳解决方案。我知道每个被加密的 item 的初始化向量必须是唯一的。因此,如果我正在加密一个地址并将其全部存储在一个字段中,那么我需要一个 iv。但是,如果我的地址分布在多个字段中,我需要多个 iv,每个字段一个。这是个问题。

有没有办法使用单个 iv 加密多个字段(所有在同一行/记录中),同时保持字段的个性?目标是每条记录有一个 iv。

我想做的是这样的

//get input for fields 1-5

//encrypt them, so that each one has its iv appended to it
$field1_enc = encr($field1);
$field2_enc = encr($field2);
$field3_enc = encr($field3);
$field4_enc = encr($field4);
$field5_enc = encr($field5);

//then store them individually in the database

如何使用一个密钥加密所有字段?那么当我想编辑这些字段时会发生什么? (我的猜测是我必须取消加密,然后用新的 iv 重新加密)。但主要问题是除了概念之外,我不明白如何以编程方式完成这项工作,即用单个 iv 加密所有字段

【问题讨论】:

    标签: php security encryption


    【解决方案1】:

    IV 必须是唯一的,但不必是不可预测的或秘密的。为什么不为每条记录创建一个随机数作为 IV 的基础。基数加 1 用作字段 1 的 IV,字段 2 加 2 ...

    编辑:这里有一些实现细节,

    为iv_base创建一个列,它只是一个随机数,

    $iv_base = random();

    加密或解密字段时,使用此函数创建IV,

    function get_iv($base, $size, $seq) {
        $remaining = $size;
        $round = 0;
        $iv = '';
        while ($remaining != 0) {
            $d = md5($base . $seq . $round, true);
            $len = min($remaining, 16);
            $iv .= substr($d, 0, $len);
            $remaining -= $len;
            $round++;
        }
        return $iv;
    }
    

    $base 是您存储在数据库中的随机数。 $size 是 IV 大小。 $seq 是您为每个字段分配的编号。您也可以使用字段名称。

    【讨论】:

    • 好点。但是,添加 1、2、3 等是什么意思?生成的 iv 是一个 base64 编码的字符串。它最初是从 MCRYPT_DEV_RANDOM 生成的,然后传递给 mcrypt_enc_get_iv_size 以获得该密码的正确大小,然后传递给 mcrypt_create_iv,然后是产生类似 Vi6emRmemexY= 的 base64 编码所以如果我认为这是我的基础,如何我应该添加 1,2,3等吗?我不认为您的意思是简单的连接,因为解码时不会产生匹配的mcrypt_enc_get_iv_size。请澄清:)
    • 我现在看到了,试试看再回来
    猜你喜欢
    • 2011-03-22
    • 1970-01-01
    • 2015-07-27
    • 2023-04-06
    • 1970-01-01
    • 2011-06-09
    • 2016-09-10
    • 2021-02-13
    • 1970-01-01
    相关资源
    最近更新 更多