https://github.com/danieljoos/wincred
Go wrapper around the Windows Credential Manager API functions
https://github.com/danieljoos/wincred
credential-storage credentials go golang windows
Last synced: about 1 year ago
JSON representation
Go wrapper around the Windows Credential Manager API functions
- Host: GitHub
- URL: https://github.com/danieljoos/wincred
- Owner: danieljoos
- License: mit
- Created: 2014-07-10T07:14:21.000Z (almost 12 years ago)
- Default Branch: master
- Last Pushed: 2024-10-07T08:52:25.000Z (over 1 year ago)
- Last Synced: 2025-04-06T19:06:00.835Z (about 1 year ago)
- Topics: credential-storage, credentials, go, golang, windows
- Language: Go
- Size: 54.7 KB
- Stars: 130
- Watchers: 4
- Forks: 19
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
wincred
=======
Go wrapper around the Windows Credential Manager API functions.
[](https://github.com/danieljoos/wincred/releases/latest)
[](https://github.com/danieljoos/wincred/actions?query=workflow%3Atest)
[](https://goreportcard.com/report/github.com/danieljoos/wincred)
[](https://codecov.io/gh/danieljoos/wincred)
[](https://pkg.go.dev/github.com/danieljoos/wincred)
Installation
------------
```Go
go get github.com/danieljoos/wincred
```
Usage
-----
See the following examples:
### Create and store a new generic credential object
```Go
package main
import (
"fmt"
"github.com/danieljoos/wincred"
)
func main() {
cred := wincred.NewGenericCredential("myGoApplication")
cred.CredentialBlob = []byte("my secret")
err := cred.Write()
if err != nil {
fmt.Println(err)
}
}
```
### Retrieve a credential object
```Go
package main
import (
"fmt"
"github.com/danieljoos/wincred"
)
func main() {
cred, err := wincred.GetGenericCredential("myGoApplication")
if err == nil {
fmt.Println(string(cred.CredentialBlob))
}
}
```
### Remove a credential object
```Go
package main
import (
"fmt"
"github.com/danieljoos/wincred"
)
func main() {
cred, err := wincred.GetGenericCredential("myGoApplication")
if err != nil {
fmt.Println(err)
return
}
cred.Delete()
}
```
### List all available credentials
```Go
package main
import (
"fmt"
"github.com/danieljoos/wincred"
)
func main() {
creds, err := wincred.List()
if err != nil {
fmt.Println(err)
return
}
for i := range(creds) {
fmt.Println(creds[i].TargetName)
}
}
```
Hints
-----
### Encoding
The credential objects simply store byte arrays without specific meaning or encoding.
For sharing between different applications, it might make sense to apply an explicit string encoding - for example **UTF-16 LE** (used nearly everywhere in the Win32 API).
```Go
package main
import (
"fmt"
"os"
"github.com/danieljoos/wincred"
"golang.org/x/text/encoding/unicode"
"golang.org/x/text/transform"
)
func main() {
cred := wincred.NewGenericCredential("myGoApplication")
encoder := unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM).NewEncoder()
blob, _, err := transform.Bytes(encoder, []byte("mysecret"))
if err != nil {
fmt.Println(err)
os.Exit(1)
}
cred.CredentialBlob = blob
err = cred.Write()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
```
### Limitations
The size of a credential blob is limited to **2560 Bytes** by the Windows API.