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

2024-03-29

我读到了关于帖子openssl_verify() http://php.net/manual/en/function.openssl-verify.php.

我想问一些与openssl_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();

?>

对于客户端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));

基本上我上传的是msg, signatureB, and stringWriter.toString()这 3 个参数传递给 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 文档 http://www.php.net/manual/en/function.openssl-pkey-get-public.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 没有在任何地方声明或定义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用PHP openssl_verify()函数验证Android客户端APP创建的签名和数据 的相关文章

  • 动态添加组件到 JDialog

    当用户单击 JDialog 上的按钮时 我在将组件添加到 JDialog 时遇到问题 基本上我希望它看起来像这样 然后 当用户单击 添加新字段 时 我希望它看起来像这样 我似乎无法打开添加新 JLabel 或 JTextField 的对话框
  • Horizo​​ntalScrollView 中带有 RecyclerView 的 2D 列表

    我正在尝试构建一个视图 允许用户水平和垂直滚动类似 Excel 的结构 我最初的想法是将 RecyclerView 带有 LinearManager 放入 Horizo ntalScrollView 中 但这似乎不起作用 这是我的代码
  • 如何使用 PHP 制作 pdf 文件

    如何用 PHP 制作 PDF 文件 我想要制作的是学生名单 所以我想查询数据库 获取信息 并在用户单击 生成学生列表 时将其以 PDF 形式提供给用户 你有两个不错的选择 首先是用于操作 pdf 的标准 php 库 https www ph
  • 如何使用 JAVA 将本地图像而不是 URL 发送到 Microsoft Cognitive Face API

    我正在尝试使用 Microsoft 认知服务的 Face API 我想知道如何通过 Rest API 调用将本地图像发送到 Face API 并使用它请求结果JAVA 有人可以帮我解决这个问题吗 Microsoft 在其网站上提供的测试选项
  • 结合 codeigniter 和 laravel

    我在用着codeigniter框架 但我想使用的功能laravel像下面的代码这样的框架 我可以打印变量而无需 Hello name 我能怎么做 Codeigniter 是一个 PHP 框架 Laravel 也是 php 框架 而这两者并不
  • Ionic框架和php mysql

    我是 Ionic Apahce Cordova 的新手 我创建了一个简单的应用程序 它具有静态列表视图项 但我想从 MYSQL 表获取数据并将其替换到我的静态列表中 我用谷歌搜索了一下 有人在研究它 但我不知道应该把我的 php 文件放在哪
  • Android 中的 EditText onClickListener

    我想要一个 EditText 它在按下时创建一个 DatePicker 所以我写了下面的代码 mEditInit EditText findViewById R id date init mEditInit setOnClickListen
  • 可以将矩形设置为显示边框吗?

    以下应用 public class Temp extends Application Override public void start Stage primaryStage StackPane root new StackPane Re
  • JDBC多线程插入可以吗?

    我目前正在开发一个 Java 项目 我需要准备一个大的 对我来说 mysql 数据库 我必须使用 Jsoup 进行网页抓取并将结果存储到我的数据库中 据我估计 我将大约插入 1 500 000 到 2 000 000 条记录 在我的第一次试
  • mysql连接3个表

    如何连接三个具有一个公共列 id 的mysql表 例如 从表1中选择a b 从表2中选择c d 从表3中选择e f 其中id x 谢谢 SELECT t1 a t1 b t2 c t2 d t3 e t3 f FROM table1 t1
  • 在 Maven Shade 插件中包含依赖项

    我正在尝试使用 Apache 的 commons lang3 创建一个可部署的 jar 但是 我的 Hadoop 所在的 AWS 集群不包含此库 因此我收到了 classNotFoundException 我想我需要手动添加该依赖项 但我在
  • Android Studio:通过命令行安装Release App

    我想从命令行导出 apk 文件 release apk 当我运行这个命令时 gradlew installRelease 我发现了这个 在根项目 中找不到 Android Studio 任务 安装版本 一些候选者是 卸载版本 我该如何解决
  • 按某些字段排序的迭代学说集合

    我需要这样的东西 products Products getTable gt find 274 foreach products gt Categories gt orderBy title as category echo categor
  • 如何在pdf中导出一对一的JTable[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 JTable 标题没有出现在图像中 https stackoverflow com questions 7369814 why does the jtable header not appea
  • 使用 appWidgetId 检查主屏幕上是否存在小部件

    我在用AlarmManager更新我的小部件 如果主屏幕上没有小部件 我想停止它 但我在检测主屏幕上是否没有小部件时遇到问题 每当我尝试使用这种方式获取 AppWidgetIds 时 AppWidgetManager appWidgetMa
  • 你在实际项目中使用过Quickcheck吗[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 快速检查 http www cs chalmers se rjmh QuickCheck 及其变体 即使有一个Java https bitbuc
  • Android Map API V2 设置自定义 InfoWindow 位置

    我对地图上的所有标记使用 InfoWindowAdapter Api v2 所有标记都清晰可见 问题是我的自定义信息窗口的大小约为 500px 300px 当我触摸地图上的任何点时 它被设置为屏幕中心 因此信息窗口将从顶部裁剪 我的要求是根
  • 更改工具栏中的标题颜色?

    我有一个使用的工具栏 并设置标题 ActionBarActivity getActivity getSupportActionBar setTitle Home 有没有办法将颜色从黑色更改为白色 我尝试制作自己的主题并将其设置在 xml 中
  • 如何将钱兑换成零钱

    尝试将输入的数字转换为 25 美分 50 美分 10 美分和 10 分 有几个问题 public class Coins public static void main String args private int quarters di
  • 如何捕获 PHP 中的 cURL 错误

    我在用PHP curl功能 https php net manual en ref curl php将数据从我的本地计算机发布到网络服务器 我的代码如下 c curl init curl setopt c CURLOPT URL url c

随机推荐

  • 使用 SelectionModel 或 ListDataProvider 选择 CellList 中的元素

    我使用 CellList 列出数据 使用 ListDataProvider 管理数据 使用 SelectionModel 从 CellList 中选择元素并相应地生成事件 现在 当我使用 cellList getList set index
  • 使用Azure B2C登录时如何在自定义页面中嵌入登录控件

    我正在使用 Azure AD B2C 示例 出于测试目的 我使用稍作修改的单页应用程序sample https github com Azure Samples active directory b2c javascript msal si
  • 如何防止创建空对象

    我正在尝试将每个列表都位于嵌套对象内部的网络服务模型映射到更简单的东西 Model 1 public class Parent private Children children public class Children private
  • 如何在Python中从邻接矩阵创建边列表数据框?

    我有一个 pandas 数据框 将其视为网络中节点的加权邻接矩阵 的形式 df A B C D A 0 0 5 0 5 0 B 1 0 0 0 C 0 8 0 0 0 2 D 0 0 1 0 我想获得一个代表边缘列表的数据框 对于上面的例子
  • PHPstorm项目导航

    如何在PHPstorm项目列表中选择打开的文件 我的意思是 PHPstorm 有一个 在项目中选择 Netbeans 功能的模拟 Navigate View在旧版本中 Select In Project View 也可以启用Autoscro
  • NuGet 将 DLL 文件放在哪里?

    我正在尝试解决 NuGet 的问题源代码控制限制 https stackoverflow com questions 7015149 multiperson team using nuget and source control 为此 我需
  • 使用关联数组作为 D3 的数据

    我有一个非常简单的 D3 示例 它首先将数据读入关联数组 然后将其显示在条形图中 不过 我似乎无法使用此方法显示任何内容 相反 我必须在两者之间插入一个任务 将数据读取到关联数组中 将该数据复制到一个简单数组中 然后使用该简单数组显示条形图
  • 获取可用(语言)resx 文件的列表

    许多程序都有社区 在应用程序发布后向其添加语言 因此 在程序的设置窗口中 人们可以看到可用语言的下拉列表 那么 人们在使用 resx 文件进行本地化时如何编码呢 我在网上搜索了一遍又一遍 但找不到任何答案 一切都运行良好 但现在 我需要制作
  • 如何在 pom.xml 文件中指定 Java 编译器版本?

    我在 Netbeans 中编写了一些 Maven 代码 大约有 2000 多行 当我在 Netbeans 上编译它时 一切都很好 但如果我想在命令行上运行它 我会收到以下错误 generics are not supported in so
  • JavaScript 风格的警报系统

    我在用smoke js http ssssnakes com smoke 它允许设置经典警报 javascript 窗口的样式 您所要做的就是放置 smoke在警报之前 即 smoke confirm 我遇到的问题是确定 取消回调 它对我不
  • 创建“拼写检查”,以合理的运行时间检查数据库

    我不是在询问如何实现拼写检查算法本身 我有一个包含数十万条记录的数据库 我想要做的是针对所有这些记录的表中的特定列检查用户输入 并返回具有特定汉明距离的任何匹配项 同样 这个问题不是关于确定汉明距离等 当然 目的是创建一个 您的意思是 功能
  • pyspark 中的交叉验证

    我使用交叉验证来训练线性回归模型 使用以下代码 from pyspark ml evaluation import RegressionEvaluator lr LinearRegression maxIter maxIteration m
  • HMC SHA1 哈希 - Java 生成与 C# 不同的哈希输出

    这是后续this https stackoverflow com questions 7175067 hmc sha1 hash c sharp producing different hash output than ruby问题 但我正
  • C# - 调整图像画布大小(保持源图像的原始像素尺寸)

    我的目标是获取图像文件并将尺寸增加到 2 的下一个幂 同时保留像素原样 也称为不缩放源图像 因此基本上最终结果将是原始图像 加上跨越图像右侧和底部的额外空白 因此总尺寸是 2 的幂 下面是我现在正在使用的代码 它创建了具有正确尺寸的图像 但
  • 在 Linux 上获取机器 ID 的最佳方法?

    获取唯一机器 ID 的最佳实践方法是什么GNU Linux for i386建筑学 除了这个还有什么好的办法吗mac地址 根据您的内核 DMI 信息可能可以通过 sysfs 获得 尝试一下 cat sys class dmi id boar
  • git-svn rebase 和 dcommit 问题

    git version 1 7 1 svn version 1 6 12 Ubuntu 10 10 我只有 git 我用过 svn 不过我没一起用过 我有一个 git 存储库 我必须将我的存储库升级为 subversion 存储库 所以我一
  • Drupal 7中用户的图片存储在哪里?

    我正在使用 SelectQuery 对象来检索和显示用户列表 但我不知道从哪里获取用户的图片 users 表有一列名为 picture 但其中的数据只是一个整数 图片是否存储在某个 blob 字段中 或者是否存在指向另一个表中图片的链接 图
  • Android:使用选择器更改按钮背景图像和颜色

    我有一个按钮 我将其背景设置为特定selector 选择器当前更改按钮背景并更改图像作为背景 我还希望更改背景颜色 图像是周围有透明空间的图标 这是选择器
  • PM2 是否应该在开发过程中使用?

    我从 Node js 世界开始 我注意到节点进程不会自动重新启动 通过搜索 我发现 Nodemon 可以完成这项工作 但我还发现 PM2 是 Nodemon 的替代品 那么我应该尝试 PM2 进行开发还是直接将其用于生产并使用 nodemo
  • 使用PHP openssl_verify()函数验证Android客户端APP创建的签名和数据

    我读到了关于帖子openssl verify http php net manual en function openssl verify php 我想问一些与openssl verify 因为我的 PHP 代码无法验证从 Java 创建的