PHP - Web服务的加密和签名创建

时间:2012-11-12 16:56:15

标签: php encryption cryptography md5 cryptographic-hash-function

我需要使用PHP创建一个“密钥”才能使用Web服务,但这对我来说没什么意义。

Web服务已经证明可以与C#应用程序一起使用,但我需要通过PHP访问它。

为了使用该服务,我需要一个“密钥”,然后是一个基于该密钥的身份验证签名。

我尝试过的所有内容都会从网络服务中抛出错误。

对于“秘密密钥”,简介是:

  1. ASCII编码纯文本密码
  2. 使用MD5
  3. 哈希编码的密码
  4. 获取MD5哈希字节并执行按位操作'& 127’
  5. 转换为base64字符串
  6. 第3点我不清楚 - 剩下的就是直截了当;我在这里错过了什么?

    然后要生成身份验证签名,简介是:

    1. UTF-8密钥的编码(秘密访问密钥是步骤4的结果)
    2. UTF-8编码日期
    3. HMAC-SHA1(UTF-8-Encoding-Of(秘密访问密钥,RequestDate))
    4. Base 64 string
    5. 同样,上面没有我能看到的问题 - 这只是让我失望的第3点。

      任何指针?

1 个答案:

答案 0 :(得分:3)

  

我不清楚这是第3点-其余的很简单。我在这里想念什么?

您描述的签名算法远非安全。最好使用Ed25519(通过sodium_crypto_sign_detached()sodium_crypto_sign_verify_detached())而不是MD5和SHA1废话。

话虽如此,他们可能期望这样的事情:

function insecureMd5Kdf($message, $raw = false)
{
    $bytes = md5($message, true);
    $output = '';
    for ($i = 0; $i < 16; ++$i) {
        $int = ord($bytes[$i]) & 127;
        $output .= pack('C', $int);
    }
    if (!$raw) {
        return bin2hex($output);
    }
    return $output;
}

演示here

为什么有人会这样做?

特别是:

  

获取MD5哈希字节并执行按位运算“&127”

在Java中,字节的范围可以从-128127。使用& 127运算符清除较高的位,从而将可能的值范围减小到[0,127]。

我怀疑答案是“惰性编程”。也就是说,有人希望快速解决Java和PHP之间的差异,并清除MD5哈希的每个字节的高位,从而避免了将其从[128,255]范围内的数字转换为[-128, -1]。

如果此Web服务仍然存在,则应询问他们最新的安全审核结果。