PHP 和 Sodium - 无法以表格形式公开传递随机数

PHP and Sodium - Unable to pass a nonce publicly in a form

如标题所示,我很难通过表单公开传递随机数的值。我尝试在表单中使用隐藏字段并将值作为参数传递给 url.

随机数是使用以下方法创建的:

$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES)

当我尝试使用从隐藏字段 (POST) 或 url (GET) 中检索到的值(例如 sodium_crypto_secretbox_open)时,返回以下错误:

Uncaught SodiumException: nonce size should be SODIUM_CRYPTO_SECRETBOX_NONCEBYTES bytes

我知道 nonce 字符串的大小受到了影响,但我不知道如何解决这个问题。

当我回显检索到的随机数时,它看起来很好。在随机数被回显后似乎出现了一个问题,它改变了大小并且被认为不适合被钠使用。

如有任何建议,我们将不胜感激。

二进制值在请求中发送时不能很好地转换,因此您可能会考虑使用 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_hex2binsodium_bin2hex

Like sodium_bin2hex(), sodium_hex2bin() is resistant to side-channel attacks while hex2bin() is not.

使用 SODIUM_CRYPTO_BOX_NONCEBYTES 而不是 SODIUM_CRYPTO_SECRETBOX_NONCEBYTES。