【问题标题】:CipherSweet - not quite getting itCipherSweet - 不太明白
【发布时间】:2020-08-20 13:49:00
【问题描述】:

我正在寻找加密 MySQL 表中的一些字段,并在此处的另一篇文章中遇到了 CipherSweet。它看起来很棒,我已经安装了它并启动了引擎,但我似乎无法离开车道...... 我不是 PHP 专家,这可能是问题的一部分——这些说明似乎假设的知识比我所拥有的要多得多。

我有一个表单可以传递我想要加密的数据(姓名、电子邮件等)——我的代码在这方面有效,我将它们转换为我以前用来成功写入数据库的变量。

$UserName = test_input($_POST["UserName"]);
$FirstName = test_input($_POST["FirstName"]);
$LastName = test_input($_POST["LastName"]);
$email = test_input($_POST["email"]);

我的问题是,我如何加密除用户名之外的行中的所有内容?我正在使用他们的设置示例,但现阶段不需要任何盲索引。

use ParagonIE\CipherSweet\Backend\ModernCrypto;
use ParagonIE\CipherSweet\CipherSweet;
use ParagonIE\CipherSweet\KeyProvider\StringProvider;
use ParagonIE\CipherSweet\EncryptedField;
use ParagonIE\CipherSweet\EncryptedRow;

$provider = new StringProvider(
    // Example key, chosen randomly, hex-encoded:
    'yaddayadda....'
);

$engine = new CipherSweet($provider);
$row = (new EncryptedRow($engine, 'contacts'))
->addTextField('UserName')
->addTextField('FirstName')
->addTextField('LastName')
->addTextField('email');

$prepared = $row->prepareRowForStorage([
    'UserName' => 'User1',
    'FirstName' => 'UserFirstName',
    'LastName' => 'UserLastName',
    'Email' => 'UserEmail'
]);

var_dump($prepared);

此时,我让它工作了——我假设 var 转储正在将看起来像加密字段的内容写入屏幕。但是,我不知道如何使用 SQL 语句将数据导入数据库。数据“看起来”是什么样的?我在 EncryptedRow 之后放置表格名称的位置是“联系人”吗? prepareRowForStorage 实际上做了什么?

正如我所说,CipherSweet 看起来很棒,但我无法完全连接所有的点!

谢谢

卡鲁姆

【问题讨论】:

  • 您要加密哪些字段以及要使用哪些字段进行查找?为您要加密执行查找的字段创建盲索引。
  • 我的计划是加密除用户名字段之外的所有字段;我不需要任何盲目查找,因为我不需要搜索任何字段,并且我希望加密尽可能多的数据。我会在需要时返回每个用户名的所有记录。
  • 所以你确实需要通过用户名查找。只需为用户名创建一个盲索引。
  • 即使我添加了盲索引,我仍然无法正常工作——我不知道如何以 CipherSweet 返回的格式将数组中的数据获取到数据库中。请问有什么想法吗?
  • 只是想知道是否有人能帮忙解决这个问题?

标签: php mysql encryption


【解决方案1】:

我的问题是,我如何加密除用户名之外的行中的所有内容?

这在有关 EncryptedRow 的文档中有所暗示。

<?php
use ParagonIE\CipherSweet\BlindIndex;
use ParagonIE\CipherSweet\CipherSweet;
use ParagonIE\CipherSweet\CompoundIndex;
use ParagonIE\CipherSweet\EncryptedRow;
use ParagonIE\CipherSweet\Transformation\LastFourDigits;

/** @var CipherSweet $engine */
// Define two fields (one text, one boolean) that will be encrypted
$row = (new EncryptedRow($engine, 'contacts'))
    ->addTextField('ssn')
    ->addBooleanField('hivstatus');

// Add a normal Blind Index on one field:
$row->addBlindIndex(
    'ssn',
    new BlindIndex(
        'contact_ssn_last_four',
        [new LastFourDigits()],
        32 // 32 bits = 4 bytes
    )
);

// Create/add a compound blind index on multiple fields:
$row->addCompoundIndex(
    (
        new CompoundIndex(
            'contact_ssnlast4_hivstatus',
            ['ssn', 'hivstatus'],
            32, // 32 bits = 4 bytes
            true // fast hash
        )
    )->addTransform('ssn', new LastFourDigits())
);

// Notice: You're passing an entire array at once, not a string
$prepared = $row->prepareRowForStorage([
    'extraneous' => true,
    'ssn' => '123-45-6789',
    'hivstatus' => false
]);

var_dump($prepared);
/*
array(2) {
  [0]=>
  array(3) {
    ["extraneous"]=>
    bool(true)
    ["ssn"]=>
    string(73) "nacl:wVMElYqnHrGB4hU118MTuANZXWHZjbsd0uK2N0Exz72mrV8sLrI_oU94vgsWlWJc84-u"
    ["hivstatus"]=>
    string(61) "nacl:ctWDJBn-NgeWc2mqEWfakvxkG7qCmIKfPpnA7jXHdbZ2CPgnZF0Yzwg="
  }
  [1]=>
  array(2) {
    ["contact_ssn_last_four"]=>
    string(8) "2acbcd1c"
    ["contact_ssnlast4_hivstatus"]=>
    string(8) "cbfd03c0"
  }
}
*/

如果您在示例中注意到,extraneous 字段在加密后仍然是明文。

所以本质上,您的EncryptedRow 对象只需要定义您要加密的字段

因此,而不是这个:

$row = (new EncryptedRow($engine, 'contacts'))
    ->addTextField('UserName')
    ->addTextField('FirstName')
    ->addTextField('LastName')
    ->addTextField('email');

您只需要这样做:

$row = (new EncryptedRow($engine, 'contacts'))
    ->addTextField('FirstName')
    ->addTextField('LastName')
    ->addTextField('email');

注意到addTextField('UserName') 已被删除?这就是你所要做的。

注意:您仍然可以在未加密的字段上编制索引

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    相关资源
    最近更新 更多