gpt4 book ai didi

PHP 的 openssl_sign 生成的签名与 SSCrypto 的签名不同

转载 作者:可可西里 更新时间:2023-11-01 00:07:33 25 4
gpt4 key购买 nike

我正在为用 PHP 编写的软件编写 OS X 客户端。该软件使用简单的 RPC 接口(interface)来接收和执行命令。 RPC 客户端必须对他发送的命令进行签名,以确保没有 MITM 可以修改任何命令。

但是,由于服务器不接受我从 OS X 客户端发送的签名,我开始调查并发现 PHP 的 openssl_sign 函数为给定的私钥/数据组合生成了与 Objective-C SSCrypto 框架不同的签名(这只是 openssl 库的包装器):

SSCrypto *crypto = [[SSCrypto alloc] initWithPrivateKey:self.localPrivKey];
NSData *shaed = [self sha1:@"hello"];
[crypto setClearTextWithData:shaed];
NSData *data = [crypto sign];

生成类似CtbkSxvqNZ+mAN的签名...

PHP代码

openssl_sign("hello", $signature, $privateKey);

生成像 6u0d2qjFiMbZ+ 这样的签名...(对于我的某个 key ,当然是 base64 编码的)

我不太清楚为什么会这样,而且我尝试了不同的哈希算法,但没有成功。正如 PHP 文档所述,默认情况下使用 SHA1。

那么为什么这两个函数会生成不同的签名,我怎样才能让我的 Objective-C 部分生成 PHPs openssl_verify 将接受的签名?

注意:我仔细检查了 key 和数据是否正确!

最佳答案

好吧,花了好几个小时。这是正在发生的事情:

当您调用 openssl_sign 函数时,PHP 在内部使用由 openssl 库提供的 EVP API。 EVP 是底层功能(如 RSA_private_encrypt)的“高级”API。因此,当您调用 base64_encode(openssl_sign('hello', $signature, $privKey)) 时,这类似于使用 openssl 二进制文件在命令行上执行类似的操作:

echo -n "hello"| openssl dgst -sha1 -sign priv.key | openssl enc -base64

echo -n "hello" | openssl dgst -sha1 | openssl rsautl -encrypt priv.key | openssl enc -base64

我不知道为什么这会产生不同的输出,但确实如此。如果有人知道他们为什么不同:请分享!
然而,当我使用 SSCrypto 框架时,我用 EVP 调用重写了 -sign(和 -verify)函数(摘要):

OpenSSL_add_all_digests();
EVP_MD_CTX_init(&md_ctx);
EVP_SignInit(&md_ctx, mdtype);
EVP_SignUpdate(&md_ctx, input, inlen);
if (EVP_SignFinal(&md_ctx, (unsigned char*) outbuf, (unsigned int *)&outlen, pkey)) {
NSLog(@"signed successfully.");
}

瞧:我得到的签名和我从 PHP 得到的一样。哦,郑重声明:PHP 使用 PKCS 填充。

谢谢你们给我指明了正确的方向!

关于PHP 的 openssl_sign 生成的签名与 SSCrypto 的签名不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2699338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com