钥匙串中存储的字符串是不是有长度限制?

Posted

技术标签:

【中文标题】钥匙串中存储的字符串是不是有长度限制?【英文标题】:Is there any length limit of string stored in Keychain?钥匙串中存储的字符串是否有长度限制? 【发布时间】:2012-11-09 10:34:12 【问题描述】:

我想将一些用户信息作为字符串存储在 ios 的 Keychain 中,那么 Keychain 中的字符串有长度限制吗?

谢谢。

【问题讨论】:

【参考方案1】:

我拼凑了一个 iOS 应用程序,该应用程序将使用 this library 进行二进制搜索以与钥匙串交互,并确定我最多可以存储一个长度为 16,777,110 的 NS(Mutable)String。明显小于其他答案中建议的 NSString 的最大长度或 SQLITE_MAX_LENGTH 的默认值。

编辑:如果您希望快速验证此答案,我建议您尝试将长度为 16,777,110 的字符串存储在钥匙串中,然后尝试长度为 16,777,111 的字符串。如果第一个有效而第二个无效,则此答案是正确的。

【讨论】:

那么性能呢?从钥匙串存储/获取长字符串需要多长时间? 顺便说一句,16777110 字节 ~= 16 MB【参考方案2】:

很难回答:) 应该支持NSString的最大长度

所以 Keychain 字符串可以容纳略多于 42 亿 个字符,与 NSString 相同

【讨论】:

钥匙链好大 根据Mark's answer 的说法,对此进行实验测试会产生低得多的限制。【参考方案3】:

iOS 的钥匙串被实现为 SQLite-database(例如参见here)。因此,存储在 SQLite 数据库中的字符串的最大长度可能是钥匙串中字符串的最大长度的上限。

根据 sqlite.org 上的this page,字符串或 BLOB 的最大字节数受预处理器宏 SQLITE_MAX_LENGTH 的限制,其默认值为 10^9。因此,假设字符串为 16 位编码,则字符串的最大长度将是该值的一半。但是,Apple 可能为 SQLITE_MAX_LENGTH 使用了较低的值。

【讨论】:

以上是关于钥匙串中存储的字符串是不是有长度限制?的主要内容,如果未能解决你的问题,请参考以下文章

如何在ios钥匙串中手动存储?

在钥匙串中存储凭据不仅加密密码

在钥匙串中存储用于加密密码的密钥的最佳位置在哪里

无法在钥匙串中正确存储值

以编程方式在 OS X 钥匙串中存储对称密钥

在苹果钥匙串中存储和读取密码的简单方法?