php - 为 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());
}
解决方案
问题是密钥大小!:) 终于完成了!!
推荐阅读
- r - R - 时间序列 ggplot 缺少列
- javascript - 强制开始仅使用 HTTP/1.1
- python - python中计数器结果的最小值
- node.js - Nestjs应用在IIS上的部署
- spring - 在计划任务中使用 spring jpaRepository 而不包含在事务中
- d3.js - D3时间字符串转换为日期
- html - HTML 浏览器图像兼容性
- entity-framework-6 - 在 EntityFramwork 6.2.0 我想创建阴影属性(是 EF 6 支持阴影属性)
- react-native - 在反应原生的屏幕之间传递不可序列化的对象
- r - 尽管使用 scale_fill_manual(),ggplotly() 仍忽略图例标签编辑