CipherSweet - не совсем понимаю - PullRequest
0 голосов
/ 05 мая 2020

Я хочу зашифровать некоторые поля в таблице MySQL и наткнулся на CipherSweet в другом посте здесь. Он выглядит превосходно, я установил его и запустил двигатель, но мне кажется, что я не могу выбраться с подъездной дорожки ... Я не эксперт PHP, и это, возможно, часть проблемы - инструкции кажутся предполагать гораздо больше знаний, чем кажется у меня.

У меня есть форма, которая передает данные (имя, адрес электронной почты и т.д. c.), Которые я хочу зашифровать - мой код в этом отношении работает, и я превращаю их в переменные, которые я ранее использовал для записи успешно в базу данных.

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

У меня вопрос, как мне затем зашифровать все в строке, кроме UserName? Я использую их пример настройки, но на данном этапе не требую никаких слепых индексов.

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 dump записывал на экран то, что выглядело как зашифрованные поля. Однако я не знаю, как затем получить данные в базе данных с помощью оператора SQL. Как «выглядят» данные? Есть ли «контакты» после EncryptedRow, где я помещаю имя своей таблицы? Что на самом деле делает prepareRowForStorage?

Как я уже сказал, CipherSweet выглядит потрясающе, но я просто не могу соединить все точки!

спасибо

Calum

1 Ответ

0 голосов
/ 17 июля 2020

Мой вопрос: как мне затем зашифровать все в строке, кроме UserName?

Это вроде намекает в документации по поводу 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') был удалено? Это все, что вам нужно сделать.

Примечание. Вы можете по-прежнему индексировать поля, которые не шифруете .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...