Claude Skills Guide

Claude Code for Vault Transit Encryption Guide

HashiCorp Vault’s Transit secrets engine provides encryption as a service, allowing developers to encrypt and decrypt data without managing encryption keys directly. When combined with Claude Code, you can implement robust encryption workflows that are both secure and easy to manage. This guide shows you how to integrate Claude Code with Vault Transit for practical encryption operations.

Understanding Vault Transit Encryption

Vault Transit is a secrets engine that handles cryptographic functions on data in transit. Unlike traditional key-value stores, Transit provides:

The Transit engine is ideal for scenarios where you need to encrypt sensitive data like credit card numbers, Social Security numbers, or other personally identifiable information (PII).

Setting Up Vault Transit

Prerequisites

Before starting, ensure you have:

Enabling the Transit Engine

Enable the Transit secrets engine and create your first encryption key:

# Enable the Transit secrets engine
vault secrets enable transit

# Create an encryption key named 'my-app-key'
vault write -f transit/keys/my-app-key \
    type=aes256-gcm

# Verify the key was created
vault list transit/keys/

When working with Claude Code, you can simply describe what you need: “Set up a new encryption key called payment-key for our billing service.” Claude will execute the necessary Vault commands.

Configuring Key Policies

Create a policy to control access to your encryption keys:

# transit-encryption-policy.hcl
path "transit/encrypt/payment-key" {
  capabilities = ["create", "update"]
}

path "transit/decrypt/payment-key" {
  capabilities = ["create", "update"]
}

path "transit/keys/payment-key" {
  capabilities = ["read"]
}

Apply the policy:

vault policy write payment-encryption transit-encryption-policy.hcl

Encrypting Data with Claude Code

Basic Encryption Workflow

The most common use case is encrypting sensitive data before storage. Here’s how Claude Code simplifies this:

# Encrypt a plaintext value
vault write transit/encrypt/my-app-key \
    plaintext=$(echo -n "sensitive-data-here" | base64)

# The response includes the ciphertext
# ciphertext: vault:v1:abcdefghijk...

When working with Claude, you can simply ask: “Encrypt this credit card number using our payment key.” Claude will handle the base64 encoding and return the encrypted value.

Encrypting Data in Applications

Here’s a practical example of encrypting user data:

# Create a plaintext file with sensitive data
echo "credit-card-number=4111111111111111" > data.txt

# Encrypt the file contents
PLAINTEXT=$(base64 -w 0 data.txt)
CIPHERTEXT=$(vault write -field=ciphertext transit/encrypt/my-app-key plaintext=$PLAINTEXT)

echo "Encrypted: $CIPHERTEXT"

Claude Code can automate this entire workflow for batch operations:

  1. read_file multiple files requiring encryption
  2. Call Vault Transit to encrypt each
  3. Store or update the encrypted values
  4. Provide a summary of all encrypted items

Decryption Operations

Decrypting data follows a similar pattern:

# Decrypt the ciphertext
vault write transit/decrypt/my-app-key \
    ciphertext=vault:v1:abcdefghijk...

# For specific field decryption
vault write transit/decrypt/my-app-key \
    ciphertext=vault:v1:abcdefghijk... \
    context=$(echo -n "additional-context" | base64)

The context parameter enables key derivation, adding an extra layer of security.

Advanced Transit Operations

Key Rotation

One of Transit’s powerful features is key rotation without re-encrypting existing data:

# Rotate to a new key version
vault write -f transit/keys/my-app-key/rotate

# Verify the new version
vault read transit/keys/my-app-key

# Encrypt using the latest key (automatically uses v2)
vault write transit/encrypt/my-app-key plaintext=$(echo -n "new-data" | base64)

# Decrypt works with both v1 and v2 ciphertexts
vault write transit/decrypt/my-app-key ciphertext=vault:v1:old-ciphertext...

Ask Claude: “Rotate our encryption key and verify all recent encryptions still work.” Claude will rotate the key and test decryption with both old and new versions.

Batch Encryption

For high-volume operations, use batch endpoints:

# Configure batch encryption
vault write transit/keys/my-app-key \
    derived=true \
    exportable=true

# Perform batch encryption
vault write transit/encrypt/batch \
    input=$(echo '["data1", "data2", "data3"]' | base64)

Managing Multiple Keys

Organize keys by purpose:

# Create keys for different use cases
vault write -f transit/keys/payments type=aes256-gcm
vault write -f transit/keys/user-data type=aes256-gcm
vault write -f transit/keys/logs type=chacha20-poly1305

# List all keys with details
vault list -format=json transit/keys/ | jq

Claude Code Integration Patterns

Creating a Transit Encryption Skill

A dedicated Claude skill makes encryption operations seamless:

---
name: vault-transit
description: "Encrypt and decrypt data using Vault Transit"
---

# Vault Transit Encryption Skill

This skill handles encryption operations using HashiCorp Vault's Transit secrets engine.

## Capabilities

- Encrypt sensitive data with specified keys
- Decrypt ciphertext back to plaintext
- Rotate encryption keys
- Manage multiple encryption keys
- Batch encryption operations

## Usage Examples

- "Encrypt this API key using the payments key"
- "Decrypt the user credentials from the database"
- "Rotate the data-encryption key"
- "Show all our encryption keys"

## Security Notes

- Never log plaintext values
- Use base64 encoding for binary data
- Include context for derived keys
- Regularly rotate keys per policy

Practical Workflow Examples

Encrypting Environment Variables:

# Encrypt all environment variables for a service
for var in DATABASE_URL API_KEY SECRET_KEY; do
    VALUE=${!var}
    CIPHER=$(vault write -field=ciphertext transit/encrypt/my-app-key \
        plaintext=$(echo -n "$VALUE" | base64))
    echo "$var=$CIPHER" >> encrypted.env
done

Database Field-Level Encryption:

# Encrypt specific database fields before storage
ENCRYPTED_SSN=$(vault write -field=ciphertext transit/encrypt/pii-key \
    plaintext=$(echo -n "$SSN" | base64))

# Store encrypted value
psql -c "UPDATE users SET ssn='$ENCRYPTED_SSN' WHERE id=$USER_ID"

API Response Encryption:

# Encrypt API responses containing sensitive data
RESPONSE_JSON='{"status":"success","data":{"ssn":"xxx-xx-xxxx"}}'
ENCRYPTED=$(vault write -field=ciphertext transit/encrypt/api-key \
    plaintext=$(echo -n "$RESPONSE_JSON" | base64))

# Send encrypted response
echo "{\"encrypted\": \"$ENCRYPTED\"}"

Best Practices

Security Recommendations

  1. Use Separate Keys by Data Type: Create distinct keys for different sensitivity levels
  2. Enable Key Rotation: Rotate keys at least annually, more frequently for sensitive data
  3. Implement Access Logging: Enable Transit audit logging to track encryption operations
  4. Use Derived Keys: Enable derivation for additional security in multi-tenant scenarios
# Enable audit logging for Transit
vault audit enable file file_path=/var/log/vault/transit-audit.log

Key Management

# Check key versions and rotation status
vault read transit/keys/my-app-key

# Archive old key versions (still allows decryption)
vault write transit/keys/my-app-key/min_decryption_version=2

# Export key material (for external systems)
vault read -field=keys transit/keys/my-app-key exportable=true

Error Handling

Implement proper error handling in your Claude workflows:

# Check key existence before encryption
vault read transit/keys/my-app-key || {
    echo "Key not found, creating..."
    vault write -f transit/keys/my-app-key type=aes256-gcm
}

# Validate ciphertext format before decryption
if [[ "$CIPHERTEXT" == vault:v1:* ]]; then
    vault write transit/decrypt/my-app-key ciphertext="$CIPHERTEXT"
else
    echo "Invalid ciphertext format"
fi

Conclusion

Vault Transit encryption combined with Claude Code provides a powerful solution for data protection. By leveraging Claude’s natural language capabilities, you can perform complex encryption operations without memorizing Vault CLI commands or managing encryption logic manually.

Start with basic encryption operations, then expand to key rotation and batch processing as your needs grow. The combination of Vault’s robust encryption infrastructure and Claude Code’s automation capabilities makes securing sensitive data accessible to developers at any level.

Remember to always follow security best practices: use separate keys for different data types, implement regular key rotation, and maintain audit logs for compliance. With these patterns in place, you can confidently handle sensitive data encryption in your applications.

Built by theluckystrike — More at zovo.one