在 iOS 上签名的数据无法在 Java 中验证

2024-01-08

我有一些要在 iOS 上签名的数据SecKeyRawSign使用椭圆曲线私钥。但是,使用 Java 验证数据Signature.verify()回报false

数据是一个随机的 64 位整数,像这样分成字节

uint64_t nonce = (some 64 bit integer)
NSData *nonceData = [NSData dataWithBytes: &nonce length: sizeof(nonce)];

我根据该数据创建 SHA256 摘要

int digestLength = CC_SHA256_DIGEST_LENGTH;
uint8_t *digest = malloc(digestLength);
CC_SHA256(nonceData.bytes, (CC_LONG)nonceData.length, digest);
NSData *digestData = [NSData dataWithBytes:digest length:digestLength];

然后用私钥签名

size_t signedBufferSize = kMaxCipherBufferSize;
uint8_t *signedBuffer = malloc(kMaxCipherBufferSize);

OSStatus status = SecKeyRawSign(privateKeyRef,
                                kSecPaddingPKCS1SHA256,
                                (const uint8_t *)digestData.bytes,
                                digestData.length,
                                &signedBuffer[0],
                                &signedBufferSize);

NSData *signedData = nil;
if (status == errSecSuccess) {
    signedData = [NSData dataWithBytes:signedBuffer length:signedBufferSize];
}

一切似乎都工作正常。

然后,在 Java 服务器中,我尝试验证签名数据

PublicKey publicKey = (a public key sent from iOS, X509 encoded)

Long nonce = (64 bit integer sent from iOS)
String signedNonce = (base64 encoded signed data)

ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
buffer.putLong(nonce);
byte[] nonceBytes = buffer.array();
byte[] signedNonceBytes = Base64.getDecoder().decode(signedNonce.getBytes());

Signature signer = Signature.getInstance( "SHA256withECDSA" );
signer.initVerify( publicKey );
signer.update( nonceBytes );
Boolean isVerified = signer.verify( signedNonceBytes );

在此刻,signer.verify()回报false

我还尝试签署纯数据,而不是 SHA256 摘要,但这也不起作用。

我缺少什么?我对数据的签名是否正确?我使用了正确的填充吗?是否还可以对数据进行其他处理以便能够验证它SHA256withECDSA算法?


字节顺序不匹配:

  • iOS is 小端。你的创造方式nonceData,该顺序被保留。
  • 在Java方面,ByteBuffer默认为大尾数法,独立于底层操作系统/硬件。

所以你需要改变字节顺序:

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

在 iOS 上签名的数据无法在 Java 中验证 的相关文章

  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 如何使用 IOS 12 在 UITableViewCell 中正确添加 UICollectionView

    由于某些原因 在使用 Xcode 10 beta 时 我无法正确显示 tableview 单元格内集合中的某些项目 在过去的四天里我尝试了我所知道的一切 我做了一个小项目样本来看看我的问题是什么 如果有人想在本地运行完整代码 请参见此处 h
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • ios8 键盘高度有所不同

    我使用下面的代码来获取键盘高度 该高度在带有 ios8 的 iPhone 5s 设备中与带有 ios7 的 IPhone4s 设备中有所不同 因此 当我在带有 ios8 的 iPhone5s 中点击它时 我的文本字段移动得非常高 而相同的代
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 使用强光混合模式时突出显示伪影

    我正在 iPhone 应用程序中使用顶部图像的 HardLight 混合模式混合两个图像 它看起来像这样 UIGraphicsBeginImageContext size sourceImage drawInRect rectangle b
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐

  • 在对象数组中插入新元素并对数组进行排序

    我有一个对象数组 其中包含学生的姓名和分数 像下面这样 我如何计算每个学生的 平均 分数并比较 平均 分数以获得尖子生 我不想使用 ES6 var Students name Bob marks 78 80 89 90 68 name Al
  • Spring-Security 3/Spring MVC 和可怕的 @Secured/RequestMapping

    我在向控制器添加安全注释时遇到了很多问题 事实证明让我的控制器实现一个InitializingBean 是个坏主意 public class MyController implements InitializingBean Secured
  • 取消 PendingIntent

    在中使用 PendingIntent 时AppWidgetProvider 我使用以下代码 views setOnClickPendingIntent viewId PendingIntent getBroadcast context 0
  • 无法使用 CSS 网格定位 HTML 图例标记

    问题 出于可访问性的原因 我有一个包含多个字段集和图例标签的表单 我希望图例标签位于输入字段下方 由于我使用 CSS Grid 作为字段集 因此使其工作 在 Firefox 上 的唯一方法是为图例标签提供绝对定位 在其他浏览器中 例如 Ch
  • C++ 中具有按位数据的结构[重复]

    这个问题在这里已经有答案了 可能的重复 将位域转换为 int https stackoverflow com questions 2468708 converting bit field to int 我正在开发一个应用程序 其中一部分处理
  • 如何转储来自 JVM 堆老年代的 Java 对象?

    有没有工具可以转储旧代 JVM 堆 换句话说 我如何判断一个对象是来自年轻代还是老年代 如果您运行 Oracle JDK 或 OpenJDK 则可以使用以下命令执行此操作热点可服务性代理 http openjdk java net grou
  • 为 pygame 中的平台添加碰撞检测

    我正在开发一款小型平台游戏 您可以在其中放置块来制作一个关卡 然后玩它 我有重力 跳跃和左右移动 但我不确定如何让玩家在向左或向右移动时与墙壁碰撞 我希望它的工作方式是这样的 if key K LEFT if not block to th
  • 使用 bootstrapvalidator AJAX SubmitHandler 不起作用

    我正在使用 Bootstrap 验证https github com nghuuphuoc bootstrapvalidator https github com nghuuphuoc bootstrapvalidator 我有一个问题 s
  • 使用 JavaScript 获取变量名称

    我想创建一个日志函数 可以在其中插入变量名称 如下所示 var a 123 b abc log a b 结果在 console log 中应该如下所示 a 123 b abc 获取变量的值没有问题 但是如何获取变量名称呢 该函数应该是通用的
  • 如何使 celery 任务从任务内部失败?

    在某些情况下 我想让芹菜任务从该任务中失败 我尝试了以下方法 from celery task import task from celery import states task def run simulation if some co
  • 如何在iOS项目中控制多个导航控制器

    我的项目的结构如下 最初 当用户注册或尝试登录时 初始导航控制器应该可以工作 并且在成功注册 登录后 用户应该被带到选项卡栏控制器的第一个选项卡 但我面临的问题是我在选项卡栏视图中看到了 2 个导航栏 有人可以指导我如何以正确的方式实现这一
  • Android 偏好,是否必须是唯一的?

    For my private static final String PREFS NAME mypref 每个应用程序的 PREFS NAME 都必须是唯一的吗 或者我可以一遍又一遍地使用同一个 每个应用程序的它必须是唯一的 不同的应用程序
  • 加载数据INFILE错误代码:13

    在我的远程 MySQL 中 当我尝试执行此查询时 我收到 MySQL 错误代码 13 Query LOAD DATA INFILE httpdocs testFile csv INTO TABLE table temp FIELDS TER
  • Google Drive API V3 - 推送通知

    从昨天早上开始 我就被谷歌驱动器 API 请求困住了 正如这里所解释的 https developers google com drive api v3 push https developers google com drive api
  • JPA 和泛型

    我想知道带有泛型的抽象类如何处理 JPA 我的意思是该字段需要什么样的注释 考虑这些 MappedSuperclass public abstract class AbstractMyClass
  • 如何在SICStus Prolog中模拟SWI-Prolog的atom_to_term(+Atom, -Term, -Bindings)?

    我正在使用 SICStus Prolog 编写 Dali 代理 我需要将原子转换为术语 但我无法使用atom to term内置于 SWI Prolog Use library codesio http sicstus sics se si
  • Ruby Mechanize、Nokogiri 和 Net::HTTP

    我使用 Net HTTP 进行 HTTP 请求并获取响应 uri URI http www example com http Net HTTP start uri host uri port proxy host proxy port re
  • 将整个 pandas multiIndex 数据框除以数据框变量

    我有一个如下形式的多索引数据框 如何将数据框中的所有值除以 df 三 one two three Number 1 2 3 1 2 3 1 2 3 Name grethe 0 299 1 444 0 920 1 378 0 376 0 39
  • 在groovy中读取Excel文件的最简单方法?

    是否有任何 warappers utils 可用于读取 Groovy 中的 Excel 文件 我正在寻找类似于 Groovy SQL 的东西rows功能如下面的 spock 测试示例所示 我的目的是用这个Spock 测试框架中使用 exce
  • 在 iOS 上签名的数据无法在 Java 中验证

    我有一些要在 iOS 上签名的数据SecKeyRawSign使用椭圆曲线私钥 但是 使用 Java 验证数据Signature verify 回报false 数据是一个随机的 64 位整数 像这样分成字节 uint64 t nonce so