如何在 macOS 上正确存储加密密钥以便只有我的可执行文件可以访问它们?

How do I correctly store encryption keys on macOS so only my executable can access them?

简介

基本上,how/where 我是否保留可执行文件所需的加密密钥?

让我解释一下我的可执行文件的样子。它基本上是一个使用 swift build --configuration=release --product=App.

编译的 Swift 脚本

Package.swift:

// swift-tools-version:5.3
import PackageDescription

let package = Package(
    name: "App",
    defaultLocalization: "en",
    platforms: [
        .macOS(.v10_15),
    ],
    products: [
        .executable(name: "App", targets: ["App"]),
    ],
    dependencies: [
        .package(url: "https://github.com/apple/swift-argument-parser", from: "1.0.1"),
        .package(url: "https://github.com/apple/swift-crypto", from: "2.0.0")
    ],
    targets: [
        .target(name: "App", dependencies: [
            .product(name: "ArgumentParser", package: "swift-argument-parser"),
            .product(name: "Crypto", package: "swift-crypto"),
        ]),
    ]
)

一些想法

Git 似乎以某种方式将用户凭据存储在钥匙串中。他们是怎么做到的呢?他们的路安全吗?

问题

如何安全地存储加密密钥,以便只有我的可执行文件(编辑:和用户)可以访问它们?

为了保护您的应用不被修改,codesign it。您可以使用私钥或使用 Apple 的公证服务。这将确保没有人修改您的应用程序或分发试图替换您的应用程序的安装程序。

您的应用创建的钥匙串项目可以有 access control lists,但即使在默认情况下,OS 也不允许其他应用在未经用户批准的情况下读取您应用的钥匙串项目。用户将收到一个弹出窗口,指示应用正在请求的项目。

所以我相信你最好的选择是签署你的应用程序,并将数据存储在钥匙串中。它通常应该开箱即用。但是当然要做很多测试。通常这些东西是故障安全的,所以在大多数情况下它不会将任何数据泄露给其他应用程序。但是如果你犯了错误,你可能会收到比你希望用户处理的更多的弹出窗口。