如何使用使用SecKey概念在iOS中生成的openssl_verify验证php中的签名

问题描述 投票:1回答:2

我的iOS应用程序,用swift编写,使用SecKeyCreateRandomKey为私钥(使用kSecAttrKeyTypeRSA和2048位属性)生成密钥对,使用SecKeyCopyPublicKey检索公钥。我使用SecKeyCreateSignature使用私钥对我的数据进行签名。

我将签名转换为字符串:signature?.base64EncodedString()

我使用SecKeyCopyExternalRepresentation将公钥SecKey结构转换为字符串,并将其转换为key.base64EncodedString()。

我(使用HTTP POST和JSON)将数据,公钥和签名发送到我的服务器。服务器将此信息存储在数据库中。

稍后,我的应用程序的其他一些实例查询服务器,服务器使用相关数据,签名和公钥进行响应。

在从服务器返回时,我使用SecKeyCreateWithData恢复公钥SecKey结构,然后应用程序使用签名和公钥使用SecKeyVerifySignature验证数据(使用.rsaSignatureMessagePKCS1v15SHA512算法)

这完美无瑕。签名,发送,存储...请求,检索,验证。因此,我知道,我来回传输数据没有问题,在应用程序方面没有让核心Apple安全功能工作的问题。然而:

我在PHP端验证签名时遇到了困难。理想情况下,我想在PHP服务器逻辑的各个点验证签名,数据,公钥。我尝试使用openssl_verify失败了。我试过(从数据库读取):

$signature = base64_decode($row["signature"]);
$publicKey = $row["publicKey"];
$tA = $row["colA"];
$tB = $row["colB"];

$data = $tA . $tB;
$key = "-----BEGIN PUBLIC KEY----- " . $publicKey . " -----END PUBLIC KEY-----";
 $ok = openssl_verify($data, $signature, $key, OPENSSL_ALGO_SHA512);

我不确定我做得对,我无法通过“强制”错误消息,openssl_verify():提供的密钥参数不能被强制转换为公钥...

虽然文档声称_verify函数特别允许$ key也作为键的字符串传递,但没有提供示例。所有的例子都处理文件和证书等。我把密钥加载到字符串中,我提供的“盔甲”iOS没有生成 - 我缺少什么?感谢帮助。

php ios openssl
2个回答
0
投票

我找到了一种解决方法(但仍在寻找openssl_verify解决方案)。我找到了一个名为phpseclib的php库。我使用composer安装它(macos)并包含它:

require 'vendor/autoload.php';
use phpseclib\Crypt\RSA;

然后我用以下代码替换了一个openssl_verify代码行:

$rsa = new RSA();
$rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);
$rsa->setHash('sha512');
$rsa->loadKey("-----BEGIN PUBLIC KEY-----\n" . trim($publicKey) . "\n-----END PUBLIC KEY-----");
$ok = $rsa->verify($data, $signature);

奇迹般有效。如果有人告诉我如何使用openssl_verify这样做,我很乐意迁移。我看到这个图书馆的一些声音已经过时了。


0
投票

我遇到了同样的问题。我发现,而不是使用SecKeyCopyExternalRepresentation()导出这样的公钥:

CFDataRef publickeyBytes;
SecItemImportExportKeyParameters keyParams = { .version = SEC_KEY_IMPORT_EXPORT_PARAMS_VERSION, .passphrase = @"" };
SecItemExport( publickey, kSecFormatOpenSSL, 0, &keyParams, &publickeyBytes );

给我公开密钥的格式可以使用openssl在PHP端导入(在base64编码和添加-----BEGIN PUBLIC KEY----------END PUBLIC KEY-----之后)

© www.soinside.com 2019 - 2024. All rights reserved.