首页 > 解决方案 > 为 SOAP Web 服务设置正确(询问)密钥 AES-256 加密的问题

问题描述

我需要对 SOAP Web 界面的密码进行加密,但是我不明白服务提供商的说明。它指出:

“通过创建今天日期+当前时间的字符串来生成公共密钥。例如,如果时间是下午 13 点,则创建 2018-05-1513,如果时间是上午 9 点,则创建 2018-05-159。时间是 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());

}

标签: phpencryptionaes

解决方案


问题是密钥大小!:) 终于完成了!!


推荐阅读