LibSodium 函数 return 无法读取的字符

LibSodium functions return unreadable characters

我正在学习加密教程:https://php.watch/articles/modern-php-encryption-decryption-sodium。在使用 Sodium 扩展时,我只是对一些事情感到困惑。谷歌搜索 return 令人沮丧的是几乎没有帮助。 (大多数结果只是 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 和 nonce 函数(至少在 Sodium 库中)似乎 return 非 UTF-8 乱码,我该怎么办? fwrite 把它拿出来一个文件供以后引用?直接传递到我的数据库? Copy/pasting 肯定不适合作为 wingdings。

除了这些之外,encryption/decryption 过程中的所有其他内容对我来说都是完全有意义的。我远不是 PHP 开发的新手,我就是想不通。

遇到 回答“PHP random_bytes returns 个不可读的字符”

random_bytes generates an arbitrary length string of cryptographic 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 和我一直在阅读的 articles/comments 中的任何地方都没有指出这一点。