【发布时间】:2021-06-17 21:34:42
【问题描述】:
我需要对 SOAP Web 界面的密码进行加密,但我不明白服务提供商的说明。它指出:
"公用密钥是通过创建今天日期+当前时间的字符串来生成的。例如,如果时间是下午13点,则创建2018-05-1513,如果时间是2018-05-159,则创建2018-05-159早上 9 点。时间是 UTC。然后使用 SHA256 算法对字符串进行哈希处理。"
这很简单,我使用以下代码 (PHP) 完成了它:
date_default_timezone_set("UTC");
$commonKey = date("Y-m-d");
$commonKey .= date("H");
$commonKey = hash('sha256', $commonKey, true);
用于进行加密的 AES 对象使用 CBC 配置为 128 位的块大小。
但是我不明白的部分来了:
创建 AES 对象时,会生成一个密钥(256 字节数组)和 IV(向量 128 位字节数组)。这些用于实际加密。一旦创建了对象,IV 就会被保存,并且您应该将密钥设置为最初从今天创建的 byteArray + 使用 SHA256 散列的实际小时数。 之后加密完成,chiffertext 和 IV 被发送到 web 服务
我不知道如何将密钥添加到公共密钥的 byteArray 中。而且我不知道网络服务如何解密我的密码。有没有人可以启发我?请注意,密钥是随机创建的,但我不知道如何处理它。
目前完整的代码如下所示:
//create commonkey
date_default_timezone_set("UTC");
$key = openssl_random_pseudo_bytes(32);
$commonKey = date("Y-m-d");
$commonKey .= date("H");
$commonKey = hash('sha256', $commonKey, true);
$cipher = "aes-128-cbc";
//encrypt password
$iv;
if (in_array($cipher, openssl_get_cipher_methods())){
$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes($ivlen);
$password = openssl_encrypt($password, $cipher, $commonKey, $options=0, $iv);
}
//check if user is allowed to login
if ($check->CheckUserLoginClubEncrypted($username, $password, $iv, $organizationalUnitID)
!== false) {
echo "Logged in";
print_r($check->getResult());
} else {
echo "Not logged in";
print_r($check->getLastError());
}
【问题讨论】:
标签: php encryption aes