keybase/go-keychain
GitHub: keybase/go-keychain
Go 语言的跨平台密钥库访问库,用于在 macOS、iOS 和 Linux 上统一管理 Keychain 中的密码与凭证。
Stars: 665 | Forks: 141
# Go Keychain
[](https://github.com/keybase/go-keychain/actions)
一个用于在 Go (golang) 中访问 macOS、iOS 和 Linux Keychain 的库。
要求 macOS 10.9 或更高版本以及 iOS 8 或更高版本。在 Linux 上,它会与
DBUS SecretService 规范的提供者(如 gnome-keyring 或 ksecretservice)进行通信。
```
import "github.com/keybase/go-keychain"
```
## Mac/iOS 用法
该 API 旨在镜像 macOS/iOS 的 Keychain API,并不一定是地道的 Go 写法。
#### 添加 Item
```
item := keychain.NewItem()
item.SetSecClass(keychain.SecClassGenericPassword)
item.SetService("MyService")
item.SetAccount("gabriel")
item.SetLabel("A label")
item.SetAccessGroup("A123456789.group.com.mycorp")
item.SetData([]byte("toomanysecrets"))
item.SetSynchronizable(keychain.SynchronizableNo)
item.SetAccessible(keychain.AccessibleWhenUnlocked)
err := keychain.AddItem(item)
if errors.Is(err, keychain.ErrorDuplicateItem) {
// Duplicate
}
```
#### 查询 Item
查询多个结果,返回属性:
```
query := keychain.NewItem()
query.SetSecClass(keychain.SecClassGenericPassword)
query.SetService(service)
query.SetAccount(account)
query.SetAccessGroup(accessGroup)
query.SetMatchLimit(keychain.MatchLimitAll)
query.SetReturnAttributes(true)
results, err := keychain.QueryItem(query)
if err != nil {
// Error
} else {
for _, r := range results {
fmt.Printf("%#v\n", r)
}
}
```
查询单个结果,返回数据:
```
query := keychain.NewItem()
query.SetSecClass(keychain.SecClassGenericPassword)
query.SetService(service)
query.SetAccount(account)
query.SetAccessGroup(accessGroup)
query.SetMatchLimit(keychain.MatchLimitOne)
query.SetReturnData(true)
results, err := keychain.QueryItem(query)
if err != nil {
// Error
} else if len(results) != 1 {
// Not found
} else {
password := string(results[0].Data)
}
```
#### 删除 Item
删除带有 service 和 account 的通用密码 item:
```
item := keychain.NewItem()
item.SetSecClass(keychain.SecClassGenericPassword)
item.SetService(service)
item.SetAccount(account)
err := keychain.DeleteItem(item)
```
### 其他
针对通用密码提供了一些便捷方法:
```
// Create generic password item with service, account, label, password, access group
item := keychain.NewGenericPassword("MyService", "gabriel", "A label", []byte("toomanysecrets"), "A123456789.group.com.mycorp")
item.SetSynchronizable(keychain.SynchronizableNo)
item.SetAccessible(keychain.AccessibleWhenUnlocked)
err := keychain.AddItem(item)
if errors.Is(err, keychain.ErrorDuplicateItem) {
// Duplicate
}
password, err := keychain.GetGenericPassword("MyService", "gabriel", "A label", "A123456789.group.com.mycorp")
accounts, err := keychain.GetGenericPasswordAccounts("MyService")
// Should have 1 account == "gabriel"
err := keychain.DeleteGenericPasswordItem("MyService", "gabriel")
if errors.Is(err, keychain.ErrorItemNotFound) {
// Not found
}
```
## iOS
`bind` 中包含可绑定的包。`ios` 中包含 iOS 项目。运行该项目以测试 iOS。
要重新生成框架:
```
(cd bind && gomobile bind -target=ios -tags=ios -o ../ios/bind.framework)
```
提交 issue 至:https://github.com/keybase/keybase-issues
标签:EVTX分析, Golang, iOS, Keychain, 安全编程, 日志审计, 系统API