使用PHP openssl_verify()函数来validationAndroid客户端APP创建的签名和数据

我读了关于openssl_verify()post

我想问一些与openssl_verify()

因为我的PHP代码无法validation从Java创建的签名…

对于服务器端,这是我的PHP代码

  

对于客户端Android APP,这里是代码的相关部分:

 // create public key and private key pair keyGen = KeyPairGenerator.getInstance("DSA"); SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); keyGen.initialize(1024, random); // Generate the Pair of Keys The final step is to generate the key pair // and to store the keys in PrivateKey and PublicKey objects. pair = keyGen.generateKeyPair(); priv = pair.getPrivate(); pub = pair.getPublic(); // Change to PEM format from original openssl format stringWriter = new StringWriter(); PEMWriter pemWriter = new PEMWriter(stringWriter); pemWriter.writeObject( pair.getPublic()); pemWriter.close(); // initialize the signature sig = Signature.getInstance("SHA1withDSA"); sig.initSign(priv); // this is the original data String msg = "original msg"; OriginalMsgByteArray = msg.getBytes(); // put original data to signature sig.update(OriginalMsgByteArray); // sign the data, and get the byte array of signature byte[] realSig = sig.sign(); // change the binary to base64 format signatureB = new String(Base64.encode(realSig)); 

基本上,我将msgsignatureBstringWriter.toString()这三个参数上传到PHP服务器,但似乎不起作用….这是我的PEM文件内容:

 -----BEGIN PUBLIC KEY----- MIIBtzCCASsGByqGSM44BAEwggEeAoGBAJ6ZIDqo1sh4pVzK8kUUA8SPxWva3sVH hrK0D86q+xpD11qhzlw28vLnZNLSq7MaPyUNKRLZL2D3x/e4fkILf7IBh6BdfOlo dI3CtAQ5Xqfw0aU8UZ35H8HlkrvrTu3qw/Ilb9wcc8Ag9C73TzuG6URK65fgvPK2 oN9MdDlVJztNAhUAkI2VBs/8eHWoG7RBCyTqyVyCwXMCgYBFj9BXduZIhDBGkoub bLwGWI6zkmC8Xel1jsRFFaRtPVS08li+SQ/XSzekidY6NP3lmYwj/kC9biG9x3mW c5hELzOVGvLM94y1KksGC+v89M99Tlrx4zVqpajRCFDyPzJQWB/HO493q6J4HwmP 1/ihdtk5THRGmPkx2uSgLKWlJAOBhQACgYEAirx5dLO2EG71ZFnUQ7FtU8FCVOYW VgZRP9SLqH8Ig5nnwmg5XFSpngzNvQ8FcWRKZkKFxYoo2j7lmQN9gl5O5cKPtuqj KecFAJA4/0y3jPzM/+1dTizM6n3WLReH2xlS6OOY5EZQmpWB//qepgTT9GUGPyOL ampB86OjNSicv0Y= -----END PUBLIC KEY----- 

我在上面的代码中看到了一些潜在的问题。

首先,根据PHP文档 ,您希望在X509证书或私钥上使用openssl_get_publickey。 公钥未列为选项。

其次,您希望将文件转换为变量,然后在openssl_get_publickey方法中使用该变量。 见下文:

 $fp = fopen("./cert.pem", "r"); $cert = fread($fp, 8192); fclose($fp); $key = openssl_get_publickey($cert); 

第三,$ bsig未在任何地方声明或定义。

到目前为止,我还没有找到解决方案来解决这个问题,但我找到了一种方法来解决这个问题,而不是解决这个问题。 如果您有相同的问题并且没有足够的时间来解决此问题,请参考此stackoverflow问题链接 。 它有RSA算法解决方案,其签名和公钥是从Android APP生成并与PHPvalidation。 但是,如果有人向我提供了这个问题的解决方案,我将不胜感激。