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