PHP и Sodium — Невозможно публично передать одноразовый номер в форме

#php #encryption #nonce #libsodium #sodium

#php #шифрование #одноразовый номер #libsodium #sodium

Вопрос:

Как следует из названия, у меня возникли трудности с публичной передачей значения одноразового номера через форму. Я пытался использовать как скрытое поле в форме, так и передавать значение в качестве параметра в URL.

Одноразовый номер создается с использованием:

 $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES)
  

Когда я пытаюсь использовать полученное значение (например, sodium_crypto_secretbox_open) либо в виде скрытого поля (POST), либо в виде URL (GET), возвращается следующая ошибка:

Неперехваченное исключение SodiumException: размер одноразового номера должен быть SODIUM_CRYPTO_SECRETBOX_NONCEBYTES байт

Я понимаю, что это влияет на размер одноразовой строки, но я понятия не имею, как решить эту проблему.

Когда я повторяю полученный одноразовый номер, он выглядит нормально. Похоже, что после отправки одноразового номера возникает проблема, заключающаяся в том, что он изменяет размер и считается неподходящим для использования sodium.

Любой совет был бы высоко оценен.

Комментарии:

1. urldecode возможно, перед попыткой обработать его на сервере

2. @RamRaider приветствует предложение, я пробовал, но, к сожалению, безрезультатно.

Ответ №1:

Двоичные значения плохо преобразуются при отправке в запросе, поэтому вы могли бы подумать о том, чтобы преобразовать необработанное одноразовое значение с помощью bin2hex , добавить в качестве скрытого ввода, а затем обработать обратный процесс с помощью hex2bin

 $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$hex=bin2hex($nonce);
/* add the above $hex as the hidden input */

/* serverside decode the input*/
$bin=hex2bin($hex);


<form method='post'>
    <input type='hidden' name='nonce' value='<?php echo $hex;?>' />
    <!-- other elements -->
    <input type='submit' />
</form>


 /* serverside */   
 $bin=hex2bin( $_POST['nonce'] );
  

Обновить:
Читайте дальше об этих собственных методах sodium sodium_hex2bin и sodium_bin2hex

Как и sodium_bin2hex() , sodium_hex2bin() устойчив к атакам по побочным каналам, в то время как hex2bin() — нет.

Комментарии:

1. это здорово, и это может сработать, создав одноразовый номер, который можно передавать через форму. Правильно ли я говорю, что это изменяет исходный одноразовый номер, перейдя в bin2hex -> hex2bin. Похоже, что он теряет пробелы и т.д…

2. Кроме того, теперь я столкнулся с другой проблемой. Как передать зашифрованное сообщение (вывод sodium_crypto_secretbox ) через форму. Я не могу использовать вышеуказанный метод, поскольку он, по-видимому, изменяет строку

3. Я думаю, что он кодирует пробелы из двоичной / необработанной версии. Что касается 2-го пункта: как только вы опубликуете данные, они будут закодированы по URL-адресу — вы учитывали это перед дальнейшей обработкой?

4. Я никогда не использовал sodium раньше, но просто посмотрел в руководстве — кажется, есть sodium_bin2base64() что может быть интересным, поскольку строки в кодировке base64 могут быть легко переданы в URL-адресах или значениях формы. Похоже, что могут представлять интерес и другие методы, такие как sodium_bin2hex и sodium_hex2bin эти последние два, предположительно, были созданы для решения ситуаций, подобных той, в которой вы оказались сейчас?!

5. Я ходил по кругу с этим, но похоже, что эти функции будут именно тем, что мне нужно. Миллион благодарностей за то, что выяснили это, я протестирую и сообщу вам о прогрессе. еще раз спасибо.

Ответ №2:

Используйте SODIUM_CRYPTO_BOX_NONCEBYTES, а не SODIUM_CRYPTO_SECRETBOX_NONCEBYTES.