问题标签 [apple-cryptokit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2524 浏览

swift - 如何访问 CryptoKit 中 SymmetricKey 的底层密钥?

我在 Xcode 11.0 beta 2 上使用 Apple 的新CryptoKit框架。我想创建一个SymmetricKey,然后获取密钥的原始字节。我想使用这些字节来创建相同的密钥,然后检查以确保密钥相等。根据我在文档中的理解,访问密钥的原始字节的唯一方法是使用withUnsafeBytes(_:)方法。我有一个带有以下代码的游乐场:

这个的输出是Are they equal? false,所以不幸的是键不匹配。假设我可以让这些键匹配,我也不确定如何转换rawKeyBytes为字符串以便在我的 Playground 输出中查看它。总的来说,我对UnsafeRawBufferPointerContiguousBytes不是很熟悉。

0 投票
1 回答
320 浏览

swift - 未知的 116 字节 ECDSA 私钥格式

iOS 13 的 CryptoKit 框架.rawRepresentation为 ECDSA 公钥和私钥提供了一个值。我一直在尝试对rawRepresentation数据类型进行逆向工程以在它和 JWK 之间进行转换。从公钥表示的 64 字节长度来看,这似乎是一个简单的x || y串联。我猜想私钥会是x || y || d,但情况似乎并非如此,因为这样做应该会产生一个 96 字节的字符串,而实际rawRepresentation144 字节。它似乎也不是有效的 DER/ASN.1 字符串。我还没有找到与我得到的实际值一致的规范。

正如您可能猜到的,Apple 的文档非常具有描述性。

rawRepresentation:将私钥表示为字节集合。

提供了一个十六进制的示例密钥对。

这可能是什么格式?

0 投票
1 回答
1378 浏览

ios - Apple、iOS 13、CryptoKit、Secure Enclave - 在使用私钥之前实施生物特征认证

我正在使用 Apple 的新 cryptokit 库,并试图让一个基本的用例正常工作。

目标:我想通过cryptokit在安全飞地中创建一个私钥,将密钥的引用存储在iOS设备的密钥链中,并确保只有在用户通过某些生物特征验证自己后才能在安全飞地中重新初始化密钥身份验证方法。

当前状态:到目前为止,我可以通过以下代码在安全飞地中初始化私钥:

此外,我可以从钥匙链中存储和检索相应的私钥的引用。检索到引用后,我可以使用以下代码重新初始化安全飞地中的私钥:

到目前为止,一切都按预期工作,并且所有使用私钥的加密操作都成功了。

现在,据我了解Apple 的备用文档,我应该能够将私钥的第一次初始化修改为如下所示。

因此,确保只有当用户通过某种生物特征认证方法对自己进行认证时,才能重新初始化私钥。初始初始化仍然没有任何错误。

问题:但是,添加前面的代码后,我没有得到任何生物特征认证提示,并且在重新初始化后根本无法使用私钥。每当我尝试使用重新初始化的密钥执行一些加密操作时,都会记录以下错误,例如一些签名:

据我从这里猜到的,我认为这Code=-9是指“authenticationNeeded”错误。

问题:有人可以向我指出一些文档或教程如何实现我正在寻找的东西或向我解释我所缺少的东西吗?

谢谢!

交叉发布:https ://forums.developer.apple.com/message/387746

0 投票
1 回答
346 浏览

swift - 使用 Cryptokit 在钥匙串中存储钥匙时出现错误状态 -34018

使用 Cryptokit 在 Mac OS 的钥匙串中存储密钥时出现错误。我正在使用 p256 算法创建密钥对。我得到的错误如下。

我正在使用的 Swift 代码如下所示。

我在 Mac OS 10.15(Beta)中使用 Xcode 创建了这个。我的 Xcode 版本是 11。

在此先感谢您的帮助

0 投票
1 回答
2522 浏览

ios - CryptoKit 在 iOS 版本低于 13 的手机上抓取应用程序

我刚刚开始使用 CryptoKit 来替换旧库。我的计划是在运行 iOS 13 及更高版本的手机上替换它,并且仍然在低于 13 的 iOS 版本上使用旧库。但是我什至无法让应用程序在 iOS 12.4 中启动而不会崩溃。我已经删除了其他所有内容,只添加了这些简单的线条

#available认为用于确保如果条件未满足,则跳过它。

奇怪的是,应用程序崩溃了,而我从来没有调用包含这些线的网格,只是将它们放在应用程序的某个位置就会导致它崩溃。

我还在顶部(有和没有if canImport(CryptoKit))导入了 CryptoKit 并且我已经添加@available(iOS 13.0, *)到类中。

谁能告诉我“排除”代码的正确方法,或者任何正确的方法,对于较低的 iOS 版本。我想它必须可以使用 iOS 13 特定的功能,同时仍然通过“旧”方法保持向后兼容性?

另外,我使用的是 Xcode 11,但我想这可能很明显。

我得到的错误是:

编辑:现在我也尝试将它放在整个班级(包括导入)

而且,我注意到这条线可以存在而不会使应用程序崩溃:

对称密钥也是 CryptoKit 的一部分

编辑2:我发现弱链接可以解决问题。我尝试使用其他新的(iOS 13)框架之一,CryptoTokenKit,并遇到了同样的问题。但是在这里我可以添加框架并将链接设置为可选,从而解决了问题。但是,当向应用程序添加框架时,由于某种原因,CryptoKit 不可用。

0 投票
0 回答
605 浏览

swift - 删除并重新创建对称密钥 (iOS) 后打开 chachapoly 密封盒?

我的 iOS 应用程序(我的第一个应用程序)有点障碍,我想加密我发送到服务器的数据。

为此,我生成了一个存储在钥匙串中的对称密钥。

密钥通过以下方式生成:

在这个函数中,密码实际上是一个计算出来的 SHA256,如下所示: SHA256.hash(data: password)它给了我一个摘要,然后我从中提取数据表示来创建我的密钥。

现在,当我加密数据时,我会执行以下操作

这将返回我然后发送到服务器的数据。

为了解密数据,我执行以下操作:

现在我的问题是,如果我注销(这意味着从手机中删除密钥)并重新登录(在我看来这会重新创建之前创建的相同密钥),那么我无法解密我的数据......我有当我尝试打开盒子时出现以下错误:

我相信这是由于我创建密钥的方式,这与之前删除的密钥不同......

我怎样才能解决这个问题 ?

谢谢 !

0 投票
0 回答
231 浏览

swift - 如何访问 HashedAuthenticationCode 的代码(作为字符串)?

鉴于以下情况HashedAuthenticationCode

我如何访问该c818a1400a9995d5faafbb5d41cc88a6701b5d1a4ded8ac169498319a2597e2a值?最终,这必须通过 a 进行编码和序列化URLSession,但我看不到获取 HAC 的“代码”部分的明显属性!

0 投票
1 回答
1825 浏览

java - Java中的iOS CryptoKit

我正在寻找 CryptoKit 的设置/参数,这将允许我在 iOS 应用程序和 Java 应用程序之间共享数据。流程如下所示: - 使用 CryptoKit 使用固定密钥和随机初始化向量 (IV) 加密文本。- 在 Java 应用程序中,使用标准 javax 库使用相同的固定密钥执行解密。随机 IV 将与加密文本一起与应用程序一起传输/共享。

同样,也需要反向操作,其中使用 JavaX 库使用固定密钥和随机 IV 对文本进行加密。随机 IV 和加密文本与 iOS 应用程序共享,它应该使用 CryptoKit 对其进行解密。

下面是Java中加密和解密的代码

CryptoKit 命令如下:

以下是在 Java 中生成加密文本的步骤:

要在 SWIFT CryptoKit 中对此进行解密,我首先需要使用此 CipherText 创建一个密封盒,但是,用于创建密封盒的 CryptoKit API 需要以下内容:

  • Nonce/IV(在上面可用)
  • 密文(在上面可用)
  • 标签(不知道从哪里得到这个????)

另一种方式,让我们首先在 CryptoKit 中加密数据

如果我将此 IV 和 CipherText 连同密钥(“12345”字符串的 SHA265 哈希)一起传递给 Java Decrypt 函数,我会收到一个 TAG 不匹配错误。

0 投票
1 回答
1078 浏览

swift - 如何将 openssl 创建的 44 字节 x25519 公钥传递给需要 32 字节密钥长度的 CryptoKit

假设我使用 openssl 创建了一个 x25519 密钥对,它将输出一个 64 字节的私钥和相应的 44 字节 Base64 编码的公钥,看起来像

Swift CryptoKit 只接受 32 字节的私钥和公钥初始化。

如果我理解正确的话,64 字节的私钥是种子,前 32 字节是实际的私钥。

尽管如此,对公钥使用相同的原则还是行不通(这并不奇怪)

现在的问题是:如何将公钥转换为 Swift CryptoKit 所需的 32 字节?

这是使用 base64 解码公钥的前 32 个字节的非功能示例

0 投票
0 回答
248 浏览

swift - CryptoKit 加密文件太大而无法存储

有没有办法用苹果 CryptoKit (AES.GCM) 加密一个对内存来说太大的文件?

我有一个大文件的 URL。该文件可能对内存来说太大了,因此我想使用 AES.GCM 使用此 SHA 示例中的流加密并最终解密该文件:

目前甚至可能吗?