Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用PHP openssl_verify()函数验证Android客户端应用程序创建的签名和数据_Java_Php_Android_Openssl - Fatal编程技术网

Java 使用PHP openssl_verify()函数验证Android客户端应用程序创建的签名和数据

Java 使用PHP openssl_verify()函数验证Android客户端应用程序创建的签名和数据,java,php,android,openssl,Java,Php,Android,Openssl,我在网上看到了这篇文章 我想问一些与openssl\u verify()相关的问题 因为我的PHP代码无法验证从Java创建的签名 对于服务器端,以下是我的PHP代码 <?php $data =$_POST['data']; $signature=$_POST['sig']; $pub_key=$_POST['pubkey']; function print_input() { global $data; global $signature; global $pu

我在网上看到了这篇文章

我想问一些与
openssl\u verify()
相关的问题

因为我的PHP代码无法验证从Java创建的签名

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

<?php
$data =$_POST['data'];
$signature=$_POST['sig'];
$pub_key=$_POST['pubkey'];

function print_input()
{
    global $data;
    global $signature;
    global $pub_key;
////////////////////////////////////////////////////////////////
// I output the public key to file, and check it to make sure they
// are in correct pem format.
///////////////////////////////////////////////////////////////
$f=fopen("./Personnel_Pubkey/pubkey.pem", "w");
fwrite($f,"$pub_key");
fclose($f);
$key = openssl_pkey_get_public ("./Personnel_Pubkey/pubkey.pem");

// doesn't work if you use PEM format public key, only works with X.509 format
// certificate, and cert and private key in PEM format.
$result=openssl_public_decrypt ( $signature, $data, $key);

////////////////////////////////////////////////////////////////
$sig=base64_decode($signature);

// for some reason, the value of $ok is always 0
$ok = openssl_verify($data, $sig, $key);

if ($ok == 1) {
    echo "good";
} 
elseif ($ok == 0) {
    echo "bad";} 
else {
    echo "ugly, error checking signature";
    }
}

print_input();

?>
基本上,我将
msg
signatureB
stringWriter.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-----

到目前为止,我还没有找到解决这个问题的方法,但我找到了一种解决方法,而不是解决这个问题。如果你有同样的问题,没有足够的时间来解决这个问题,请参考。它有RSA algo解决方案,其签名和公钥由android应用程序生成,并用php验证。不过,如果有人向我提供这个问题的解决方案,我将不胜感激

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

首先,根据,您希望在X509证书或私钥上使用openssl_get_公钥。公钥未作为选项列出

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

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

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

您能更详细地描述一下什么似乎不起作用吗?你有错误信息或类似的信息吗?另外,你可以发布一些你的Android应用程序实际发送到服务器的示例输出吗?请通过编辑将它们添加到您的问题中-谢谢!我在您的代码中看到了一些可能导致问题的问题。更多细节见我的答案。你提到的问题是正确的。但是[openssl_verify()](php.net/manual/en/function.openssl verify.php)部分怎么样?这部分也失败了…在文档中,有人说它正在使用PEM格式的公钥$bsig只是打字错误,问题是updated@user1145976您的原始邮件是否存储在$data中?如果是这样,那么当您尝试解密签名时,它将被替换为其他内容。删除解密行,看看会发生什么。一旦我有机会测试,我会做,看看是否有区别。谢谢。:)
$fp = fopen("./cert.pem", "r");
$cert = fread($fp, 8192);
fclose($fp);
$key = openssl_get_publickey($cert);