android - Swift 和 Kotlin 的密钥派生函数库?
问题描述
我正在努力让我的应用用户能够将他们的数据与云同步。但是我计划通过加密他们的数据来安全地做到这一点。我的计划是根据堆栈交换接受的答案执行以下操作:
https://security.stackexchange.com/questions/157422/store-encrypted-user-data-in-database
- 使用密钥派生函数将用户的密码转换为加密密钥
- 使用加密安全的伪随机数生成器生成单独的密钥,用于加密用户的数据
- 使用派生密钥加密生成的密钥
- 然后可以将生成的数据加密密钥密文安全地存储在数据库的用户表中
我面临的障碍是密钥派生功能。我有适用于 iOS 和 Android 的相同应用程序,想知道是否有一个可供 iOS (swift) 和 Android (kotlin) 访问的库。我担心的是,如果我为密钥派生函数使用不同的库,我将无法为 iOS 和 Android 创建相同的密钥,因此如果用户例如从使用切换时将无法解密他们的数据Android 到 iOS,反之亦然。以前有没有人遇到过这个问题,如果有,您使用了什么库或工具?我的担心是没有根据的,不会有问题吗?我试图避免使用 KMS,因为我认为那会很昂贵。
解决方案
我有适用于 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,因为我认为那会很昂贵。
您可能是对的,但由于可能的性能问题而放弃更安全的设计似乎还为时过早。
推荐阅读
- reactjs - 遵循规则的 react-hooks/exhaustive-deps 会导致错误。不是所有的依赖都应该被关注吗?
- javascript - 尝试使用 JWT 创建登录时出现“不是函数”错误
- c++ - Windows TCP 连接失败和重传
- c++ - C ++中的复制构造函数和移动构造函数有什么区别
- c# - 为什么我的程序中“powercfg”命令的输出与在 powershell 中运行时不同
- javascript - 检查一个数组的元素是否包含在另一个数组的元素中
- java - 如何在 IntelliJ 2020.2.1 中添加和使用 jar 文件进行测试?
- c# - Web API HTTPGet 用于多个属性?
- windows-runtime - 我应该如何在 cppwinrt 中将 AddHandler 与 Handler 对象一起使用?
- r - 评估分段函数(曲线错误(...,:'expr' 未评估为长度为 'n' 的对象)