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

标签 php objective-c security openssl rsa

我正在为用 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/

相关文章:

php - 如何设置 PHP 脚本的最长执行时间?

php - 尝试使用 ErrorDocument 时出现 404 Not Found 错误

objective-c - 为什么 NSURLSession 不使用我配置的 NSURLCache?

Azure Blob 存储文件级安全性

java - 限制 java 只执行签名的 jar?

javascript - 保护纯客户端主干应用程序

php - 如何使用 file_get_contents 发送 cookie

javascript - Highcharts 无法通过 AJAX 运行

objective-c - 在Objective C中,是否可以从类外部使用选择器?

iphone - 核心图中的自定义 X 轴