PHP 和 Sodium - 无法在表单中公开传递随机数

Posted

技术标签:

【中文标题】PHP 和 Sodium - 无法在表单中公开传递随机数【英文标题】:PHP and Sodium - Unable to pass a nonce publicly in a form 【发布时间】:2019-08-27 05:40:47 【问题描述】:

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

nonce 是使用以下方法创建的:

$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES)

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

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

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

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

任何建议将不胜感激。

【问题讨论】:

urldecode 可能在尝试在服务器端处理它之前 @RamRaider 为这个建议喝彩,我试过了,但不幸的是没有快乐。 【参考方案1】:

在请求中发送二进制值时不能很好地转换,因此您可能会考虑使用bin2hex 转换原始随机数值,添加为隐藏输入,然后使用hex2bin 处理反向过程/p>

$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() 抗side-channel attacks 而 hex2bin() 不是。

【讨论】:

太好了,它可以通过创建一个可以通过表单传递的可用随机数来工作。我是否正确地说它确实通过 bin2hex -> hex2bin 改变了原始随机数。它似乎失去了空格等...... 另外,我现在发现自己遇到了另一个问题。如何通过表单传递加密消息( sodium_crypto_secretbox 的输出)。我不能使用上述技术,因为它似乎会改变字符串 我认为它对二进制/原始版本中的空白进行了编码。至于第二点:一旦您发布数据,它将被 url 编码 - 在进一步处理之前您是否考虑到了这一点? 我以前从未使用过sodium,但只是查看了手册 - 似乎有sodium_bin2base64() 这可能很有趣,因为base64 编码的字符串可以很容易地在url 或表单值中传递。看起来其他方法可能也很有趣,例如 sodium_bin2hexsodium_hex2bin 这最后两个可能是为了处理您现在发现的情况?! 我一直在兜圈子,但看起来这些功能正是我所追求的。感谢一百万您发现这些,我将测试并更新您的进度。再次感谢。【参考方案2】:

使用 SODIUM_CRYPTO_BOX_NONCEBYTES 而不是 SODIUM_CRYPTO_SECRETBOX_NONCEBYTES。

【讨论】:

以上是关于PHP 和 Sodium - 无法在表单中公开传递随机数的主要内容,如果未能解决你的问题,请参考以下文章

PHP的Sodium加密扩展函数了解

php7安装sodium扩展

PHP7.2.6安装sodium扩展

PHP安装扩展补充说明

将值从 php 表单传递到 Paypal 金额

PHP:如何在一个表单操作中实现图片与文字一起传递