php - 为什么有些字符无法从 Linux/Bash 环境变量中提取到 PHP 中?

标签 php linux bash environment-variables openssh

我会尽量让它尽可能短,但不会让它完全不可读。

我使用 PHP 的 openssl 实现将加密数据集存储在我的数据库中。

这是与我正在做的类似的事情:

$pw = 'nobody loves you like I do.';
$cm = 'aes-256-cbc-hmac-sha256';
$c_key = '-$k���۱�d��o��ּ)2�"�C�!{���"�pO�⌧Ӝ�A��)mL�ڡ��i����OP753D8⮩eÒ98u07ף�11�u�e';
$iv = '�w�[(32';
$sslpw = openssl_encrypt($pw, $cm, $c_key, $options=0, $iv);

我填充 $c_key$iv 的值都是使用 openssl_random_pseudo_bytes() 生成的

所以,认为这里没有问题,我制作了一个小文件,其中包含所有这些值,以便像这样获取到环境变量中:

export PAXYZ_C_KEY='-$k���۱�d��o��ּ)2�"�C�!{���"�pO�⌧Ӝ�A��)mL�ڡ��i����OP753D8⮩eÒ98u07ף�11�u�e';
export PAXYZ_C_IV='�w�[(32'

但是,在我获取文件并将它们读入我的 PHP 脚本之后,我丢失了每个字符串的 50%,即使它们是字符串文字。

但是,如果我直接通过命令行设置环境变量,它设置得很好。问题是将其粘贴在文件中并将其设置在文件中。我什至不知道为什么这会有所作为,但确实如此。

如果我严格遵守 PHP,那么这些字符中的任何一个都没有问题。

我什至可以在什么级别诊断这个?我是复制粘贴到终端还是编辑器似乎并不重要——结果是一样的。但实际上,这是我的专业知识逐渐停止的地方。

不幸的是,我已经用我当前的 key 集完成了很多加密工作 - 所以如果没有必要,我不会太热衷于重新加密所有内容。

最佳答案

环境变量是 C 字符串,因此不能包含空字节。随机数据,如 openssl_random_pseudo_bytes() 的输出,通常包含空字节。您需要以保证它们不包含空字节的方式对这些函数的输出进行编码;一种直接的方法是在将它们放入环境变量之前使用 base64_encode()

关于php - 为什么有些字符无法从 Linux/Bash 环境变量中提取到 PHP 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56159530/

相关文章:

javascript - 将 php 重定向到 youtube 应用 ios

php - 获取mysql中最后一条记录

php - Laravel Passport oauth/authorize 返回基本授权

PHP 5.4 PDO 无法使用旧的不安全身份验证连接到 MySQL 4.1+

mysql - 附加文件会导致碎片吗?

linux - CentOS运行后Docker自动停止

bash - 如何在 bash 中有条件地添加管道元素

android - 从eclipse/android环境生成项目/类图

linux - 如何在 bash 中传递自定义脚本?

bash - 退出使用 $() 的 bash 脚本