Documentation
¶
Index ¶
- func Decrypt(encodedPayload string) (string, error)
- func Encrypt(plaintext string) (string, error)
- func GenerateAppKey() (string, error)
- func GenerateKeyToEnv(envPath string) (string, error)
- func GetAppKey() ([]byte, error)
- func GetPreviousAppKeys() ([][]byte, error)
- func ReadAppKey(key string) ([]byte, error)
- func RotateKeyInEnv(envPath string) (string, error)
- type Cipher
- type EncryptedPayload
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Decrypt ¶
Decrypt decrypts an encrypted payload using the APP_KEY from environment. Falls back to APP_PREVIOUS_KEYS when the current key cannot decrypt. @group Encryption @behavior readonly
Example: decrypt using current key
appKey, _ := crypt.GenerateAppKey()
_ = os.Setenv("APP_KEY", appKey)
ciphertext, _ := crypt.Encrypt("secret")
plaintext, _ := crypt.Decrypt(ciphertext)
godump.Dump(plaintext)
// #string "secret"
Example: decrypt ciphertext encrypted with a previous key
oldAppKey, _ := crypt.GenerateAppKey()
newAppKey, _ := crypt.GenerateAppKey()
// Encrypt with the old key first.
_ = os.Setenv("APP_KEY", oldAppKey)
rotatedCiphertext, _ := crypt.Encrypt("rotated")
// Rotate to a new current key, but keep the old key in APP_PREVIOUS_KEYS.
_ = os.Setenv("APP_KEY", newAppKey)
_ = os.Setenv("APP_PREVIOUS_KEYS", oldAppKey)
plaintext, err := crypt.Decrypt(rotatedCiphertext)
godump.Dump(plaintext, err)
// #string "rotated"
// #error <nil>
func Encrypt ¶
Encrypt encrypts a plaintext using the APP_KEY from environment. @group Encryption @behavior readonly
Example: encrypt with current APP_KEY
appKey, _ := crypt.GenerateAppKey()
_ = os.Setenv("APP_KEY", appKey)
ciphertext, err := crypt.Encrypt("secret")
godump.Dump(err == nil, ciphertext != "")
// #bool true
// #bool true
func GenerateAppKey ¶
GenerateAppKey generates a random base64 app key prefixed with "base64:". @group Key management @behavior readonly
Example: generate an AES-256 key
key, _ := crypt.GenerateAppKey() godump.Dump(key) // #string "base64:..."
func GenerateKeyToEnv ¶
GenerateKeyToEnv mimics Laravel's key:generate. It generates a new APP_KEY and writes it to the provided .env path. Other keys are preserved; APP_KEY is replaced/added. @group Key management @behavior mutates-filesystem
Example: generate and write APP_KEY to a temp .env
envPath := filepath.Join(os.TempDir(), ".env") key, err := crypt.GenerateKeyToEnv(envPath) godump.Dump(err, key) // #error <nil> // #string "base64:..."
func GetAppKey ¶
GetAppKey retrieves the APP_KEY from the environment and parses it. @group Key management @behavior readonly
Example: read APP_KEY and ensure the correct size
appKey, _ := crypt.GenerateAppKey()
_ = os.Setenv("APP_KEY", appKey)
key, err := crypt.GetAppKey()
godump.Dump(len(key), err)
// #int 32
// #error <nil>
func GetPreviousAppKeys ¶
GetPreviousAppKeys retrieves and parses APP_PREVIOUS_KEYS from the environment. Keys are expected to be comma-delimited and prefixed with "base64:". @group Key management @behavior readonly
Example: parse two previous keys (mixed AES-128/256)
oldKeyA, _ := crypt.GenerateAppKey()
oldKeyB, _ := crypt.GenerateAppKey()
// APP_PREVIOUS_KEYS is a comma-separated list.
_ = os.Setenv("APP_PREVIOUS_KEYS", oldKeyA+", "+oldKeyB)
keys, err := crypt.GetPreviousAppKeys()
godump.Dump(len(keys), err)
// #int 2
// #error <nil>
func ReadAppKey ¶
ReadAppKey parses a base64 encoded app key with "base64:" prefix. Accepts 16-byte keys (AES-128) or 32-byte keys (AES-256) after decoding. @group Key management @behavior readonly
Example: parse AES-128 and AES-256 keys
// Build a 16-byte (AES-128) key string manually. raw16 := make([]byte, 16) _, _ = rand.Read(raw16) key16 := "base64:" + base64.StdEncoding.EncodeToString(raw16) // Generate a 32-byte (AES-256) key string with the helper. key32, _ := crypt.GenerateAppKey() parsed16, _ := crypt.ReadAppKey(key16) parsed32, _ := crypt.ReadAppKey(key32) godump.Dump(len(parsed16), len(parsed32)) // #int 16 // #int 32
func RotateKeyInEnv ¶
RotateKeyInEnv mimics Laravel's key:rotate. It moves the current APP_KEY into APP_PREVIOUS_KEYS (prepended) and writes a new APP_KEY. @group Key management @behavior mutates-filesystem
Example: rotate APP_KEY and prepend old key to APP_PREVIOUS_KEYS
envPath := filepath.Join(os.TempDir(), ".env")
currentKey, _ := crypt.GenerateAppKey()
// Seed a minimal .env with an existing APP_KEY.
_ = os.WriteFile(envPath, []byte("APP_KEY="+currentKey+"\n"), 0o644)
newKey, err := crypt.RotateKeyInEnv(envPath)
godump.Dump(err == nil, newKey != "")
// #bool true
// #bool true
Types ¶
type Cipher ¶ added in v1.1.0
type Cipher struct {
// contains filtered or unexported fields
}
Cipher provides instance-based encryption/decryption with injected keys. It is safe to construct in DI containers and avoids relying on process-global env state. @group Encryption @behavior readonly
func New ¶ added in v1.1.0
New constructs a Cipher with an injected current key and optional previous keys. Keys must be 16 bytes (AES-128) or 32 bytes (AES-256). Inputs are copied. @group Key management @behavior readonly
func NewFromEnv ¶ added in v1.1.0
NewFromEnv constructs a Cipher from APP_KEY and APP_PREVIOUS_KEYS. @group Key management @behavior readonly
type EncryptedPayload ¶
type EncryptedPayload struct {
IV string `json:"iv"`
Value string `json:"value"`
MAC string `json:"mac"`
}
EncryptedPayload is the JSON structure wrapped in base64 used for ciphertext.