summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLevi Durfee <levi.durfee@gmail.com>2026-01-07 08:57:35 -0500
committerLevi Durfee <levi.durfee@gmail.com>2026-01-07 08:57:41 -0500
commit22ce0770a047b44c8168ec1ccd21b7771903ff42 (patch)
tree0a0f2e6be5ede94980a6fb39bbde971a78b7b915
parent54d3a02387059b6e803be4435f101979fc5b7cd3 (diff)
Add pbkdf2 with salt
-rw-r--r--go.mod5
-rw-r--r--go.sum2
-rw-r--r--internal/decrypt.go2
-rw-r--r--internal/encrypt.go2
-rw-r--r--internal/goaes.go30
5 files changed, 33 insertions, 8 deletions
diff --git a/go.mod b/go.mod
index fbb6ae9..33b24e1 100644
--- a/go.mod
+++ b/go.mod
@@ -4,4 +4,7 @@ go 1.25
require github.com/joho/godotenv v1.5.1
-require github.com/urfave/cli/v3 v3.6.1
+require (
+ github.com/urfave/cli/v3 v3.6.1
+ golang.org/x/crypto v0.46.0
+)
diff --git a/go.sum b/go.sum
index e648845..4a2a4ce 100644
--- a/go.sum
+++ b/go.sum
@@ -8,5 +8,7 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/urfave/cli/v3 v3.6.1 h1:j8Qq8NyUawj/7rTYdBGrxcH7A/j7/G8Q5LhWEW4G3Mo=
github.com/urfave/cli/v3 v3.6.1/go.mod h1:ysVLtOEmg2tOy6PknnYVhDoouyC/6N42TMeoMzskhso=
+golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU=
+golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/internal/decrypt.go b/internal/decrypt.go
index d8d9ef4..bc2e64b 100644
--- a/internal/decrypt.go
+++ b/internal/decrypt.go
@@ -7,7 +7,7 @@ import (
func Decrypt(edek WrappedDEK, ct Ciphertext) ([]byte, error) {
godotenv.Load()
- kek, err := NewKEKFromEnvB64("SECRET_KEY")
+ kek, err := NewKEKFromEnvB64("GOAES_PASSPHRASE", "GOAES_SALT")
if err != nil {
return nil, err
}
diff --git a/internal/encrypt.go b/internal/encrypt.go
index bc3bf7f..fdaceb3 100644
--- a/internal/encrypt.go
+++ b/internal/encrypt.go
@@ -7,7 +7,7 @@ import (
func Encrypt(data []byte) (EncryptedDataPayload, error) {
godotenv.Load()
- kek, err := NewKEKFromEnvB64("SECRET_KEY")
+ kek, err := NewKEKFromEnvB64("GOAES_PASSPHRASE", "GOAES_SALT")
if err != nil {
return EncryptedDataPayload{}, err
}
diff --git a/internal/goaes.go b/internal/goaes.go
index ce054e8..f9e2f3e 100644
--- a/internal/goaes.go
+++ b/internal/goaes.go
@@ -4,24 +4,44 @@ import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
+ "crypto/sha256"
"encoding/base64"
"errors"
"fmt"
"io"
"os"
+
+ "golang.org/x/crypto/pbkdf2"
+)
+
+const (
+ keyIterations = 600_000
+ keyLength = 32
)
-func NewKEKFromEnvB64(envVar string) (KEK, error) {
- b64 := os.Getenv(envVar)
+func NewKEKFromEnvB64(passphraseEnvVar, saltEnvVar string) (KEK, error) {
+ b64 := os.Getenv(passphraseEnvVar)
if b64 == "" {
- return nil, fmt.Errorf("%s is not set", envVar)
+ return nil, fmt.Errorf("%s is not set", passphraseEnvVar)
+ }
+
+ b64Salt := os.Getenv(saltEnvVar)
+ if b64Salt == "" {
+ return nil, fmt.Errorf("%s is not set", saltEnvVar)
}
- raw, err := base64.StdEncoding.DecodeString(b64)
+ passphrase, err := base64.StdEncoding.DecodeString(b64)
if err != nil {
- return nil, fmt.Errorf("decode %s base64: %w", envVar, err)
+ return nil, fmt.Errorf("decode %s base64: %w", passphraseEnvVar, err)
}
+ salt, err := base64.StdEncoding.DecodeString(b64Salt)
+ if err != nil {
+ return nil, fmt.Errorf("decode %s base64: %w", saltEnvVar, err)
+ }
+
+ raw := pbkdf2.Key(passphrase, salt, keyIterations, keyLength, sha256.New)
+
if !validAESKeyLen(len(raw)) {
return nil, errBadKeyLn
}