PHP 的 AWS 开发工具包 - 解密密码
AWS SDK for PHP - Decrypting a Password
对于我正在处理的项目,我正在为 PHP 使用 Amazon AWS SDK,并且我需要以纯文本格式检索服务器环境的密码。然而,ec2 方法的 documentation 证实了我们的发现:该方法只会 return 一个加密的字符串。从表面上看,这很好,因为 PHP 的 AWS 开发工具包使用未加密的 HTTP POST 请求通过 cURL 发送和接收数据,对用户是不可见的。所以我们不会让我们的密码数据在网络上四处传播。
问题是没有解释如何解密字符串。我将我的私钥作为 PEM 文件,但没有方法或文档说明如何处理该字符串以使其可用。几次尝试都没有结果,我开始认为我需要重新考虑我正在进行的项目的策略,但后来我找到了 PHP 的最新版本 AWS SDK 的代码,它揭示了如何着手解密字符串以生成密码的纯文本形式。
我找到的答案是 getPasswordData 方法 returns 一个同时经过 base64 编码和加密的字符串。在使用 PHP 的 OpenSSL 库成功解密之前,您需要使用 base64_decode() 对其进行解码。以下函数兼顾两者:
/**
* @param obj $ec2_client The EC2 PHP client, from the AWS SDK for PHP
* @param string $client_id The ID of the client whose password we're trying to get.
* @return mixed The unencrypted password for the client, or false on failure.
*/
function aws_get_ec2_password($ec2_client, $client_id){
// First, run getPasswordData to get the Password Data Object.
$pw_obj = $ec2_client->getPasswordData($client_id);
// Next, use the local get() method to isolate the password
$pw_b64 = $pw_obj->get("PasswordData");
// Decode the password string.
$pw_encrypted = base64_decode($pw_b64);
// Now, get your PEM key.
//
// You can also use a raw string of the PEM key instead of get_file_contents(),
// or adjust the function so that you can pass it as an argument.
//
// Technically, this step might not be necessary, as the documentation for
// openssl_private_decrypt() suggests that $key can just be the path, and it will
// create the key object internally.
$key = openssl_get_privatekey(file_get_contents("path/to/key.pem"));
// Create an empty string to hold the password.
$pw = "";
// Finally, decrypt the string and return (will return false if decryption fails).
if(openssl_private_decrypt($pw_encrypted, $pw, $key)){
return $pw;
}else{
return false;
}
}
我希望这可以帮助其他人避免让我头疼的问题!
对于我正在处理的项目,我正在为 PHP 使用 Amazon AWS SDK,并且我需要以纯文本格式检索服务器环境的密码。然而,ec2 方法的 documentation 证实了我们的发现:该方法只会 return 一个加密的字符串。从表面上看,这很好,因为 PHP 的 AWS 开发工具包使用未加密的 HTTP POST 请求通过 cURL 发送和接收数据,对用户是不可见的。所以我们不会让我们的密码数据在网络上四处传播。
问题是没有解释如何解密字符串。我将我的私钥作为 PEM 文件,但没有方法或文档说明如何处理该字符串以使其可用。几次尝试都没有结果,我开始认为我需要重新考虑我正在进行的项目的策略,但后来我找到了 PHP 的最新版本 AWS SDK 的代码,它揭示了如何着手解密字符串以生成密码的纯文本形式。
我找到的答案是 getPasswordData 方法 returns 一个同时经过 base64 编码和加密的字符串。在使用 PHP 的 OpenSSL 库成功解密之前,您需要使用 base64_decode() 对其进行解码。以下函数兼顾两者:
/**
* @param obj $ec2_client The EC2 PHP client, from the AWS SDK for PHP
* @param string $client_id The ID of the client whose password we're trying to get.
* @return mixed The unencrypted password for the client, or false on failure.
*/
function aws_get_ec2_password($ec2_client, $client_id){
// First, run getPasswordData to get the Password Data Object.
$pw_obj = $ec2_client->getPasswordData($client_id);
// Next, use the local get() method to isolate the password
$pw_b64 = $pw_obj->get("PasswordData");
// Decode the password string.
$pw_encrypted = base64_decode($pw_b64);
// Now, get your PEM key.
//
// You can also use a raw string of the PEM key instead of get_file_contents(),
// or adjust the function so that you can pass it as an argument.
//
// Technically, this step might not be necessary, as the documentation for
// openssl_private_decrypt() suggests that $key can just be the path, and it will
// create the key object internally.
$key = openssl_get_privatekey(file_get_contents("path/to/key.pem"));
// Create an empty string to hold the password.
$pw = "";
// Finally, decrypt the string and return (will return false if decryption fails).
if(openssl_private_decrypt($pw_encrypted, $pw, $key)){
return $pw;
}else{
return false;
}
}
我希望这可以帮助其他人避免让我头疼的问题!