1

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

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

$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES)

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

未捕获的 SodiumException:nonce 大小应为 SODIUM_CRYPTO_SECRETBOX_NONCEBYTES 字节

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

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

任何建议将不胜感激。

4

2 回答 2

4

二进制值在请求中发送时不能很好地转换,因此您可能会考虑的一件事是使用 转换原始随机数值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

sodium_bin2hex(),sodium_hex2bin()可以抵抗侧信道攻击 ,而 hex2bin() 则不能。

于 2019-04-05T10:41:43.617 回答
0

使用 SODIUM_CRYPTO_BOX_NONCEBYTES 而不是 SODIUM_CRYPTO_SECRETBOX_NONCEBYTES。

于 2021-05-29T15:27:45.433 回答