#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.