下面是一个关于加密的教程:https://php.watch/articles/modern-php-encryption-decryption-sodium。在使用钠扩展的过程中,我只是对一些事情感到困惑。谷歌( Googling )对谷歌的帮助微乎其微。(大多数结果只是重复php.net/手册。)
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.我找不到任何关于存储密钥或非keys的最佳实践的信息。
我只是认为,这显然是为了安全--人们--但不是--其他人的一些信息,这将是关于关键氏族和非安全等的文章中经常讨论的部分。考虑到我的keygen函数和当前函数(至少在钠库中)似乎返回了非UTF-8垃圾信息,我该如何处理它呢?fwrite将其输出到一个文件中供以后参考?直接传给我的数据库?复制/粘贴当然不正确,因为它是翅膀。
除此之外,加密/解密过程中的其他一切对我来说都是完全有意义的。我对PHP开发并不陌生,只是搞不懂这一点。
发布于 2021-12-10 21:12:00
偶然看到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"因此,大量使用bin2hex和hex2bin,但这现在是有意义的。有效地解决了问题,尽管不太自信,但这是正确的解决方法。我仍然不知道为什么在php.net/手册中没有指出这一点,也不知道我一直在阅读的任何文章/评论中都没有指出这一点。
https://stackoverflow.com/questions/70310082
复制相似问题