【问题标题】:Key derivation function library for both Swift and Kotlin? [closed]Swift 和 Kotlin 的密钥派生函数库? [关闭]
【发布时间】:2021-09-15 04:46:42
【问题描述】:

我正在努力让我的应用用户能够将他们的数据与云同步。但是我计划通过加密他们的数据来安全地做到这一点。我的计划是根据堆栈交换上接受的答案执行以下操作:

https://security.stackexchange.com/questions/157422/store-encrypted-user-data-in-database

  1. 使用密钥派生函数将用户密码转换为加密密钥
  2. 使用加密安全的伪随机数生成器生成单独的密钥,用于加密用户的数据
  3. 使用派生密钥加密生成的密钥
  4. 生成的数据加密密钥密文随后可以安全地存储在数据库的用户表中

我面临的障碍是密钥派生功能。我对 iOS 和 Android 有相同的应用程序,想知道是否有一个可供 iOS (swift) 和 Android (kotlin) 访问的库。我担心的是,如果我为密钥派生函数使用不同的库,我将无法为 iOS 和 Android 创建相同的密钥,因此如果用户例如从使用切换时将无法解密他们的数据Android 到 iOS,反之亦然。以前有没有人遇到过这个问题,如果有,您使用了什么库或工具?我的担心是没有根据的,不会有问题吗?我试图避免使用 KMS,因为我认为那会很昂贵。

【问题讨论】:

  • 我正在使用CryptLib 对用户数据进行跨平台加密和解密。看看有没有帮助。
  • @LalitFauzdar 。 “支持 SHA-256 散列密钥。切勿使用纯文本作为加密密钥”。是的,你也不应该在密码上使用 SHA-256。对安全一无所知的人不应该创建跨平台加密库。

标签: android ios swift kotlin encryption


【解决方案1】:

我有适用于 iOS 和 Android 的相同应用程序,想知道是否有可供 iOS (swift) 和 Android (kotlin) 访问的库。

PKBDF2 应该在 Java / Android 和 Kotlin 中可用。请注意,在 Java 中处理字符可能存在差异(Java 中的 LSB 为 char,Android 中为 UTF-8)。

您也可以使用提供更好安全性或功能的 PBKDF,例如 scrypt(内存硬盘)或 Argon2,但在这种情况下,您需要使用外部库。

无论如何,如果密码可以由普通用户生成或记住,它们将永远无法达到 128 位安全性,因此请记住这一点,尤其是对于很可能离线攻击的加密。

我担心的是,如果我为密钥派生函数使用不同的库,我将无法为 iOS 和 Android 创建相同的密钥,因此用户将无法解密他们的数据,例如从使用 Android 切换到 iOS,反之亦然。

您的担心部分是没有根据的,因为这些功能遵循已发布的标准,例如PKCS#5 在 PBKDF2 的情况下。唯一可以(并且将)经常不同的是函数的配置。字符集编码是一种,但例如PBKDF2 内部使用的哈希是另一个。

我强烈建议首先使用正确的安全参数配置 PBKDF2,然后尝试在这两种语言中实现。请记住,让它工作并不是安全的主要目标。你想使用例如SHA-256 或更高版本以及高迭代次数。对于 PBKDF2,您也不想提取比散列算法提供的输出更多的字节(例如 SHA-256 的 32 个字节)。

无论你做什么,创建一个书面协议,从代码中指向它,并且永远不要使用默认算法或值:只需输入它们。只有随机数生成可能最好留给运行时默认值。

我的担心是没有根据的,不会有问题吗?

部分没有根据:标准化会有所帮助,但配置上的差异可能会咬你一口。

我试图避免使用 KMS,因为我认为那会很昂贵。

您可能是对的,但因为可能性能问题而放弃更安全的设计似乎为时过早。

【讨论】:

  • 谢谢!这是一个很好的答案,这是有道理的。虽然昨天在考虑这个问题时,我想到了另一件事可能是一个问题。如果用户忘记了密码怎么办?如果我创建一个单独的密钥来加密/解密他们的数据,然后使用从他们的密码中派生的密钥对该密钥进行加密,那么这个解决方案如何实现密码恢复?还是有其他我可能错过的解决方案?
  • 好吧,使用当前方案,您只能使用密码。您可以考虑对数据密钥进行两次加密:一次使用密码派生密钥,另一次使用您非常安全地存储私钥的公钥(例如离线、在单独的机器上、在储物柜中)在掩体中,在月球上的军事基地,由月球上的总统或类似的东西进行审计:P)。当然,在这种情况下,您需要告知用户您也可以解密他们的数据。
  • 好的,谢谢!这真的很有帮助,我会在这和 KMS 之间权衡我的选择。
猜你喜欢
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 2017-03-29
  • 1970-01-01
相关资源
最近更新 更多