3

介绍

基本上,我如何/在哪里保留可执行文件需要的加密密钥?

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

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"),
        ]),
    ]
)

一些想法

  • 我知道 Apple 在 macOS 上提供了一个钥匙串来存储密钥。问题是我的可执行文件没有以任何方式签名,因此很难强制执行只有我的可执行文件才能访问存储的密钥。(至少我是这么认为的,如果我错了,请纠正我)

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

  • 我的下一个想法是将密钥存储在用户的主目录中,例如.ssh. 这似乎不安全。据我所知,系统上运行的任何应用程序都可以读取密钥,对吧?

  • 实现此目的的另一种方法是使用密码加密密钥,然后让用户在每次需要密钥时输入密码。这是最不可取的选择,因为它不方便。

  • 我想到的最后一个选择是以某种方式签署我的可执行文件。有什么方法可以签署我的可执行文件,以便它可以在钥匙串中有自己的受保护空间?我需要的是一个流程来签署我的可执行文件,而不需要 Apple 开发者帐户或任何其他中央授权。

问题

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

4

1 回答 1

1

为保护您的应用免遭修改,请对其进行共同设计。您可以使用私钥或使用 Apple 的公证服务。这将确保没有人修改您的应用程序或分发试图替换您的应用程序的安装程序。

您的应用创建的钥匙串项目可以具有访问控制列表,但即使在默认情况下,操作系统也不允许其他应用在未经用户批准的情况下读取您应用的钥匙串项目。用户将收到一个弹出窗口,指示应用程序正在请求的项目。

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

于 2021-09-29T16:50:17.977 回答