【问题标题】:LibSodium functions return unreadable charactersLibSodium 函数返回不可读的字符
【发布时间】: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。检查这是否也适用于钠输出。

标签: php libsodium


【解决方案1】:

遇到https://stackoverflow.com/a/44874239/1128978 回答“PHP random_bytes 返回不可读的字符”

random_bytes 生成任意长度的加密随机字节字符串...

并建议使用bin2hex 来获取可读字符。所以修改我的用法:

// Generate $ciphertext
$message = 'This is a secret message';
$key = sodium_crypto_*_keygen();
$nonce = random_bytes(SODIUM_CRYPTO_*BYTES);
$ciphertext = sodium_crypto_*_encrypt($message, '', $nonce, $key);

// Store hexadecimal versions of binary output
$nonce_hex = bin2hex($nonce);
$key_hex = bin2hex($key);
$ciphertext_hex = bin2hex($ciphertext);

// When ready to decrypt, convert hexadecimal values back to binary
$ciphertext_bin = hex2bin($ciphertext_hex);
$nonce_bin = hex2bin($nonce_hex);
$key_bin = hex2bin($key_hex);

$decrypted = sodium_crypto_*_decrypt($ciphertext_bin, '', $nonce_bin, $key_bin);
// "This is a secret message"

所以大量使用bin2hexhex2bin,但这现在是有道理的。有效解决,但不确定这是使用它的正确方法。我仍然不知道为什么在 php.net/manual 以及我一直在阅读的任何文章/cmets 中都没有指出这一点。

【讨论】:

    猜你喜欢
    • 2016-06-16
    • 1970-01-01
    • 2015-09-03
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多