实际上,我为此感到十分苦恼。这应该是一件小事,但我已经花费了几个小时的时间。
function ssl_encrypt($pass, $data) {
$salt = substr(md5(mt_rand(), true), 8);
$key = md5($pass . $salt, true);
$iv = md5($key . $pass . $salt, true);
$ct = mcrypt_encrypt (MCRYPT_RIJNDAEL_128, $key, $data,
MCRYPT_MODE_CBC, $iv);
return base64_encode('Salted__' . $salt . $ct);
}
$key = ssl_encrypt('super', trim($_POST['pass']));
我正在使用以下方式加密字符串并保存到文件中:
$value = $_POST['service'] . "=" . $key . "\n";
file_put_contents($file, $value , FILE_APPEND);
然后它输出类似于这样的内容:
U2FsdGVkX1+0NB4++Kx28hUWNGwIqBoabI2O22U1TbpJ0n4FhzZvGtmSWiP7VOZj⏎
我认为最后一个符号是来自于这个 "\n"。
$value = $_POST['service'] . "=" . $key . "\n";
我甚至尝试了这样的方法:
$value = $_POST['service'] . "=" . $key.PHP_EOL;
$fh = fopen($file,"a+");
fwrite($fh, $value); //write to txtfile
fclose($fh);
但是它输出了:
U2FsdGVkX1 + 0NB4 ++ Kx28hUWNGwIqBoabI2O22U1TbpJ0n4FhzZvGtmSWiP7VOZj
如何去掉最后一个退格符?请注意,在这种情况下,子字符串不是一个选择。
这是我解密的方式:
function ssl_decrypt($pass, $data) {
$data = base64_decode($data);
$salt = substr($data, 8, 8);
$ct = substr($data, 16);
$key = md5($pass . $salt, true);
$iv = md5($key . $pass . $salt, true);
$pt = mcrypt_decrypt (MCRYPT_RIJNDAEL_128, $key, $ct,
MCRYPT_MODE_CBC, $iv);
return $pt;
}
$Loader = new josegonzalez\Dotenv\Loader($pathtoenv);
// 解析 .env 文件
$environment = (new josegonzalez\Dotenv\Loader($pathtoenv))
->parse()
->toArray();
$digitalpass = ssl_decrypt('super', (string)$_ENV['digital']);
PHP_EOL
代表的是换行符,Linux 系统下通常是\n
,Windows 系统下则是\r\n
。如果你使用 Linux 系统,可以通过hexdump -C
命令查看该字符的实际值(或者使用 PHP 的chr()
函数)。另外,由于需要在文件末尾添加记录,因此必须使用\n
来分隔每条记录。不过,你可以使用trim()
函数来去除字符串末尾的换行符。 - Kenneysubstr($output, 0, -1);
吗? - Sergio Toledo Piza