3 php security openssl rsa objective-c
我正在为一个用PHP编写的软件编写OS X客户端.该软件使用简单的RPC接口来接收和执行命令.RPC客户端必须对他发送的命令进行签名,以确保没有MITM可以修改它们中的任何一个.
但是,由于服务器不接受我从OS X客户端发送的签名,我开始调查并发现PHP的openssl_sign函数为给定的私钥/数据组合生成与Objective-C SSCrypto框架不同的签名(这是只是openssl lib的包装器:
SSCrypto *crypto = [[SSCrypto alloc] initWithPrivateKey:self.localPrivKey];
NSData *shaed = [self sha1:@"hello"];
[crypto setClearTextWithData:shaed];
NSData *data = [crypto sign];
Run Code Online (Sandbox Code Playgroud)
生成像CtbkSxvqNZ+mAN...... 这样的签名
PHP代码
openssl_sign("hello", $signature, $privateKey);
Run Code Online (Sandbox Code Playgroud)
生成一个像6u0d2qjFiMbZ+...... 这样的签名(当然是我的某个密钥.base64编码)
我不太清楚为什么会发生这种情况而且我没有成功地尝试使用不同的哈希算法.由于PHP文档声明默认使用SHA1.
那么为什么这两个函数会生成不同的签名?如何让Objective-C部分生成PHP openssl_verify接受的签名?
注意:我仔细检查了密钥和数据是否正确!
小智 8
好的,花了不少时间.这是发生了什么:
当您调用该openssl_sign函数时,PHP在内部使用openssl lib提供的EVP API.EVP是底层函数的"高级"API RSA_private_encrypt.因此,当您base64_encode(openssl_sign('hello', $signature, $privKey))使用openssl二进制文件在命令行上调用类似于这样的操作时:
echo -n "hello"| openssl dgst -sha1 -sign priv.key | openssl enc -base64
Run Code Online (Sandbox Code Playgroud)
而不是
echo -n "hello" | openssl dgst -sha1 | openssl rsautl -encrypt priv.key | openssl enc -base64
Run Code Online (Sandbox Code Playgroud)
我不知道为什么会产生不同的输出,但确实如此.如果有人知道他们为什么不同:请分享!
但是,当我使用SSCrypto框架时,我用EVP调用重写了-sign(和-verify)函数(abstract):
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.");
}
Run Code Online (Sandbox Code Playgroud)
瞧:我得到了与PHP相同的签名.哦,为了记录:PHP使用PKCS填充.
谢谢你们指点我正确的方向!
| 归档时间: |
|
| 查看次数: |
5555 次 |
| 最近记录: |