keybase/go-keychain

GitHub: keybase/go-keychain

Go 语言的跨平台密钥库访问库,用于在 macOS、iOS 和 Linux 上统一管理 Keychain 中的密码与凭证。

Stars: 665 | Forks: 141

# Go Keychain [![构建状态](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](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