【发布时间】:2022-01-15 11:23:46
【问题描述】:
我正在关注加密教程:https://php.watch/articles/modern-php-encryption-decryption-sodium。在使用 Sodium 扩展时,我只是对一些事情感到困惑。谷歌搜索返回的帮助令人沮丧。 (大部分结果只是对php.net/manual的重复。)
1。在我正在阅读的各种文章中,sodium_crypto_*_encrypt() 的结果很熟悉:
// ex. DEx9ATXEg/eRq8GWD3NT5BatB3m31WED
每当我自己回声时,我都会得到类似的东西:
// ex. ????�2(*���3�CV��Wu��R~�u���H��
我确定它不会正确存储在数据库中。文章或文档中没有任何地方提到关于字符集怪异的任何内容。我可以在那里扔一个header('Content-Type: text/html; charset=ISO-8859-1'),但我仍然会得到奇怪的字符,我不确定是否正确,因为我没有找到任何讨论这个的线程:
// ex. ÑAÁ5eŠ…n@±'ýÞÃ1è9ÜÈ̳¬"CžãÚ0ÿÛ
2。我找不到有关存储密钥或随机数的最佳做法的任何信息。
我只是认为这种对安全人员来说显而易见但对其他人而言并不明显的信息将成为关于 keygen 和 nonces 等文章的定期讨论部分。看到我的 keygen 和 nonce 函数(至少在 Sodium 库中)似乎返回非 UTF-8 乱码,我该怎么处理它? fwrite 将其输出到文件以供稍后引用?将其直接传递到我的数据库?复制/粘贴肯定不能正常工作。
除了这些之外,加密/解密过程中的其他所有事情对我来说都是完全有意义的。我对 PHP 开发还很陌生,我只是想不通。
【问题讨论】:
-
猜猜 *encrypt 函数返回一个字节流。您可能可以使用例如转换为文本
base64_encode. -
@berend 如此尝试。这似乎并没有弄清楚。转储
base64_encode($secret)返回(string) "̷$>�q["。我没有看到任何地方谈论它返回字节流。一些功能适用于流,但不适用于 keygen。甚至random_bytes($n)也在为我返回胡言乱语。认为我的 MAMP 中可能有一些关闭设置。 -
等一下。 stackoverflow.com/a/44874239/1128978 建议将
bin2hex()用于random_bytes。检查这是否也适用于钠输出。