为什么 CryptoSwift 函数 ChaCha20(key: "Key", iv: "Iv") 返回 nil 而不是抛出错误?

iPr*_*ram -1 encryption optional swift2 cryptoswift

我目前正在尝试制作类似于master password 的我自己的密码管理器应用程序,它使用一种算法来生成密码,因此它们不必存储在客户端计算机上或在线。

为了实现这一点,我决定使用使用CryptoSwift库的 ChaCha20 密码算法。这是我目前拥有的代码(OS X 应用程序):

import Cocoa
import CryptoSwift

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet weak var window: NSWindow!


    func applicationDidFinishLaunching(aNotification: NSNotification) {

        do
        {
            let UInt8String = "Test".utf8
            print("UTF8 string: \(UInt8String)")
            let UInt8Array = Array(UInt8String)
            print("UTF8 array: \(UInt8Array)")

            let encrypted = try ChaCha20(key: "Key", iv: "Iv")!.encrypt(UInt8Array)

            print("Encrypted data: \(encrypted)")
        } catch _ {

        }
    }

    func applicationWillTerminate(aNotification: NSNotification) {
        // Insert code here to tear down your application
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到错误的那一行是let encrypted = try ChaCha20(key: "Key", iv: "Iv")!.encrypt(UInt8Array). 我得到的错误是“致命错误:在解开可选值时意外发现 nil”。这可能是由于“!” 在 encrypt 方法之前,因为在此之前其他一切都有效。我试过替换“!” 带有“?”,但是encrypted如果我删除“!”,则变量等于 nil 或者 '?' 一共我得到一个语法错误。

我将如何解决let encrypted = try ChaCha20(key: "Key", iv: "Iv")!.encrypt(UInt8Array)在线问题?

Rob*_*ier 5

ChaCha20 的密钥大小为 128 或 256 位(16 或 32 字节)。您正在传递 3 个字节。“IV”(这里真的是随机数)是 8 个字节。你通过了 2。你不应该期望它构造一个密码对象。因为它没有,所以你会得到零,然后当你应用!它时会按照你的要求崩溃(这就是什么!意思)。

您需要创建一个随机密钥和正确大小的随机数。如果您有密码,则需要使用适当的 KDF(例如 PBKDF2)将其转换为密钥。

如果您不清楚其中任何一个,那么您还没有构建安全密码管理器所需的技能,您真的应该先停下来研究如何安全地实施密码学。我并不是说你是一个糟糕的开发人员或不熟悉 Cocoa 开发。这是容易创建看起来安全,“安全”部件都做出来完全不安全的加密系统。如果这是您感兴趣的领域,我强烈推荐Coursera的密码学 I课程。密码学并不是一点点努力就无法理解的深奥谜团,但它肯定不直观,而且绝大多数加密工具(包括 CryptoSwift)都假设您已经知道自己在做什么。

如果你想要一些现成的东西来为你处理许多困难的部分,那么你可能想看看RNCryptor。这对于您自己的个人密码管理器来说可能就足够了,但我永远不会建议在构建加密系统方面没有坚实基础的其他人构建密码管理器(即使您选择了 RNCryptor 来实现它)。密码管理器对安全性至关重要,如果没有强大的主题基础就无法构建。