php 如何验证从 React Native 库生成的 RSA 签名

How to verify a RSA signature generated from react native lib in php

react native library for biometrics 生成一个 base 64 签名,我想使用 public 密钥 RSA 2048 以纯文本形式存储在数据库中(也由库生成)来验证该签名以验证用户使用正确的 public 键。 根据 Topaco 的评论,我注意到 public 密钥和签名作为没有填充的单行字符串从库中返回。

$publicKeyResource = openssl_pkey_get_public(("-----BEGIN PUBLIC KEY-----\n".$publicKey."\n-----END PUBLIC KEY-----"));
$verify = openssl_verify($message, base64_decode($signature), $publicKeyResource, "sha256withRSAEncryption" );

$verify 总是返回 0

格式化后的 Public 键示例:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyEQAmIthd0J7TdWGLt1X
Q3TdGhzoXVMiiENy9HDqlQKPImEwy4PEzJUr9JEZsWE4LarxsgkKnVZgiE+cNxSV
cE+zVBNaeb2hKxejrRVBpe9xgXb2agjrG7twuTKyBe+SeEIB1LRfwVHcKw7jSLle
ih4xhMHtZ6Q/crgzkBLH/EZ47stTv80EcFvreM7S+bfVfajE7qiuNHvPNaRtLEVh
iC4PTUqSfnuEb1xv3uC7mnIRNLTxfgbwUmzjjfnUlr+jxcWyb35JVCtgb3nsV/2H
G0TCSyNJ5X0tPfIDy7EfDjc9Mj9n+thPgTKCtbMXwPCQu7jLqI4AAubstJv3p3Uc
NQIDAQAB
-----END PUBLIC KEY-----

消息签名示例:“auth”

mglZm2RKmkBIR+cNkuOJwAjnJJUAoyUl4w5NnzJsAFxuyvRhlJ3RS1Jksvzn90lp6lRG8aBy0nbxyCR2CpOjCH3G4XuUThTpJ862CPp5OMI9t9Ne6+/w2YiLj0Raq6WAiNDqxzg1PKRzojLvVpZd9P1URpevkoG6cQnk+FzITtESDmGaPtIgMV9ON2rrtF7Occ1PblFjSwCfkm3To3R4QdBgiVSdLIjoJvdff2RzId2dlGZxxiKyLs5JK6oFppmls/TcfMVvffj/fBFW9HjIggpHz8KmJTSb1crepK9WxrkKMvMs2Qsbd5nzf/SwiXDfFaBMKXJ30/2e3TqQ3CFXiQ==

我找到了关于同一个库的 similiar question,但他们的解决方案与我使用的相同,但对我不起作用。

问题是我忘记了一段代码,它调用了在身份验证之前生成新密钥对的函数(当我检查设备是否支持生物识别时),所以我正在验证一个新密钥生成的签名与保存在数据库中的旧密钥。感谢@Topaco 和@President James K. Polk 确认签名和 public 密钥

之间的不一致