如何在 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"),
]),
]
)
一些想法
- 我知道 Apple 在 macOS 上提供了一个钥匙串来存储密钥。问题是我的可执行文件没有以任何方式签名,因此很难强制只有我的可执行文件可以访问存储的密钥。 (至少我是这么认为的,如果我错了请纠正我)
Git 似乎以某种方式将用户凭据存储在钥匙串中。他们是怎么做到的呢?他们的路安全吗?
我的下一个想法是将密钥存储在用户的主目录中,如 .ssh
。这似乎没有安全感。据我所知,系统上的任何应用 运行 都可以读取密钥,对吗?
实现此目的的另一种方法是使用密码加密密钥,然后让用户在每次需要密钥时输入密码。这是最不推荐的选择,因为它不方便。
我想到的最后一个选择是以某种方式签署我的可执行文件。有什么方法可以签署我的可执行文件,以便它可以在钥匙串中拥有自己的保护 space 吗?我需要的是一个无需 Apple 开发者帐户或任何其他中央机构即可对我的可执行文件进行签名的过程。
问题
如何安全地存储加密密钥,以便只有我的可执行文件(编辑:和用户)可以访问它们?
为了保护您的应用不被修改,codesign it。您可以使用私钥或使用 Apple 的公证服务。这将确保没有人修改您的应用程序或分发试图替换您的应用程序的安装程序。
您的应用创建的钥匙串项目可以有 access control lists,但即使在默认情况下,OS 也不允许其他应用在未经用户批准的情况下读取您应用的钥匙串项目。用户将收到一个弹出窗口,指示应用正在请求的项目。
所以我相信你最好的选择是签署你的应用程序,并将数据存储在钥匙串中。它通常应该开箱即用。但是当然要做很多测试。通常这些东西是故障安全的,所以在大多数情况下它不会将任何数据泄露给其他应用程序。但是如果你犯了错误,你可能会收到比你希望用户处理的更多的弹出窗口。
简介
基本上,how/where 我是否保留可执行文件所需的加密密钥?
让我解释一下我的可执行文件的样子。它基本上是一个使用 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
。这似乎没有安全感。据我所知,系统上的任何应用 运行 都可以读取密钥,对吗?实现此目的的另一种方法是使用密码加密密钥,然后让用户在每次需要密钥时输入密码。这是最不推荐的选择,因为它不方便。
我想到的最后一个选择是以某种方式签署我的可执行文件。有什么方法可以签署我的可执行文件,以便它可以在钥匙串中拥有自己的保护 space 吗?我需要的是一个无需 Apple 开发者帐户或任何其他中央机构即可对我的可执行文件进行签名的过程。
问题
如何安全地存储加密密钥,以便只有我的可执行文件(编辑:和用户)可以访问它们?
为了保护您的应用不被修改,codesign it。您可以使用私钥或使用 Apple 的公证服务。这将确保没有人修改您的应用程序或分发试图替换您的应用程序的安装程序。
您的应用创建的钥匙串项目可以有 access control lists,但即使在默认情况下,OS 也不允许其他应用在未经用户批准的情况下读取您应用的钥匙串项目。用户将收到一个弹出窗口,指示应用正在请求的项目。
所以我相信你最好的选择是签署你的应用程序,并将数据存储在钥匙串中。它通常应该开箱即用。但是当然要做很多测试。通常这些东西是故障安全的,所以在大多数情况下它不会将任何数据泄露给其他应用程序。但是如果你犯了错误,你可能会收到比你希望用户处理的更多的弹出窗口。