-1

私は現在、マスター パスワードに似た独自のパスワード マネージャー アプリケーションを作成しようとしています。これは、アルゴリズムを使用してパスワードを生成するため、クライアント コンピューターやオンラインに保存する必要がありません。

これを実現するために、 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
    }
}

エラーが発生している行はlet encrypted = try ChaCha20(key: "Key", iv: "Iv")!.encrypt(UInt8Array). 私が得ているエラーは、「致命的なエラー: オプション値のラップ解除中に予期せず nil が見つかりました」です。これはおそらく「!」が原因です。他のすべてがその前に機能するため、暗号化メソッドの前に。「!」を置き換えてみました ただし、「!」を削除すると、変数encryptedは nil に等しくなります。また '?' 全体として、構文エラーが発生します。

let encrypted = try ChaCha20(key: "Key", iv: "Iv")!.encrypt(UInt8Array)回線の問題をどのように修正しますか?

4

2 に答える 2

5

ChaCha20 のキーサイズは 128 または 256 ビット (16 または 32 バイト) です。あなたは3バイトを渡しています。「IV」(ここでは実際に nonce) は 8 バイトです。2 を渡しています。これが暗号オブジェクトを構築するとは思わないでください。そうでないため、nil になり、適用する!と、要求どおりにクラッシュします (これが!意味することです)。

正しいサイズのランダム キーと nonce を作成する必要があります。パスワードがある場合は、PBKDF2 などの適切な KDF を使用してキーに変換する必要があります。

これらのいずれかが不明な場合は、安全なパスワード マネージャーを構築するために必要なスキル セットをまだ持っていないため、最初に暗号化を安全に実装する方法をやめて検討する必要があります。あなたが下手な開発者だとか、Cocoa 開発に慣れていないという意味ではありません。安全に見え、「安全な」コンポーネントで構成されている、完全に安全でない暗号化システムを作成するのは非常に簡単です。この分野に興味がある場合は、Courseraの暗号化 Iコースを強くお勧めします。暗号化は少しの努力で理解できるような深い謎ではありませんが、確かに直感的ではなく、(CryptoSwift を含む) 存在する暗号化ツールの大部分は、自分が何をしているかを既に知っていることを前提としています。

難しい部分の多くを処理する既製のものが必要な場合は、RNCryptorを検討することをお勧めします。あなた自身の個人的なパスワード マネージャーにはそれで十分かもしれませんが、暗号システムを構築するための強力な基盤がなければ、他の人のためにパスワード マネージャーを構築することは決してお勧めしません (実装するために RNCryptor を選択したとしても)。パスワード マネージャーは、セキュリティが非常に重要であり、この分野の強力な基盤がなければ構築できません。

于 2016-01-01T19:31:20.117 に答える
1

あなたが書いた:

これはおそらく「!」が原因です。他のすべてがその前に機能するため、暗号化メソッドの前に。「!」を置き換えてみました ただし、暗号化された変数は nil に等しくなります

それも正しい答えです。問題は、関数 / またはコンストラクターChaCha20(key: "Key", iv: "Iv")が nil を返し、エラーをスローしなかった理由です。2 つの可能性があります。(a) ChaCha20 は定義によりエラーをスローしないか、(b) パラメータは OK であり、結果はまだ nil です。問題は、自分のコードではなく、何らかの理由で ChaCha20 が失敗したことであるため、CryptoSwift フレームワークのドキュメントを確認する必要があります。

アップデート!私はCryptoSwiftをチェックして見つけました

public init?(key:[UInt8], iv:[UInt8]) {
        if let c = contextSetup(iv: iv, key: key) {
            context = c
        } else {
            return nil
        }
    }

コードのパラメーターが間違っています ([UInt8] ではなく String を使用しています)。有効なバージョンのライブラリを使用していますか? コードを実行できるため、コンパイラからエラーは発生しませんでした...確認してください。

于 2016-01-01T19:29:22.890 に答える