Privacy Tools Guide

Sharing passwords across a team without proper security measures creates significant vulnerabilities. Whether you’re managing API keys, database credentials, or service accounts, the method of transmission matters as much as the storage solution. This guide covers practical approaches for securely sharing passwords with your team using encrypted communication channels, focusing on tools and techniques that work well for developers and power users.

Why Standard Communication Channels Fail

Email, Slack, Discord, and similar platforms store messages on servers that you don’t control. Even if the platform uses TLS for transit, messages often persist in databases, backups, and log files. A compromised employee account, server breach, or legal request can expose credentials that were shared carelessly. The solution is end-to-end encryption combined with ephemeral messaging—ensuring that credentials exist only on the sender’s and recipient’s devices.

Using Age for Encrypted Password Sharing

Age is a modern encryption tool that excels at secure file sharing. Unlike PGP, age has a minimal attack surface and requires no key management infrastructure. Here’s how to use it for team password sharing:

Setting Up Age Keys

Each team member generates their own age key pair:

# Generate a new age key pair
age-keygen

# Output example:
# # created: 2026-03-16T10:30:00
# # public key: age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrjwjkg5eu6rqfpklg
# AGE-SECRET-KEY-1YOURSECRETKEYHERE

Store the secret key securely—ideally in a password manager. Share the public key with teammates who need to send you credentials.

Encrypting Passwords for Team Members

To share a password with specific team members, encrypt the credential using their public keys:

# Create a file with the password
echo "my-secret-api-key-12345" > api_key.txt

# Encrypt for one recipient
age -r age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrjwjkg5eu6rqfpklg -o api_key.age api_key.txt

# Encrypt for multiple recipients (redundancy)
age -r age1teammate1pubkey -r age1teammate2pubkey -o shared_credentials.age credentials.txt

The .age file contains encrypted data that only the specified recipients can decrypt. Send this file through any channel—the content remains secure.

Decrypting Received Credentials

Recipients decrypt the file using their age secret key:

# Decrypt the file (prompts for key or uses SSH agent)
age -d -i ~/.config/age/keys.txt api_key.age

# Output: my-secret-api-key-12345

For automated pipelines or scripts, set the AGE_CONFIG_DIR environment variable and use SSH agent integration.

Using GPG for Sensitive Credential Sharing

GPG remains widely used in enterprise environments. While more complex than age, it offers compatibility with systems that expect PGP-signed messages.

Encrypting for Team Distribution

# Export your public key to share with teammates
gpg --export -a "your@email.com" > yourname_pubkey.asc

# Import teammate's public key
gpg --import teammate_pubkey.asc

# Encrypt a password file for specific recipients
echo "db_password_prod_2026" | gpg --encrypt --armor \
  --recipient teammate@company.com \
  --output db_credentials.gpg

Using GPG with Pass

The pass password manager integrates GPG encryption with Git version control, making it excellent for team password management:

# Initialize a password store
pass init "team-gpg-key-id"

# Insert a new password
pass insert dev/database-api-key
# Enter password: [type securely]

# Generate a random password
pass generate dev/service-account-token 32

# List all stored passwords
pass

Team members clone the password store repository and use GPG keys to access shared credentials. All passwords remain encrypted at rest—only authorized team members can decrypt them.

Signal: Ephemeral Password Sharing

For one-off password sharing during conversations, Signal provides disappearing messages with screenshot detection:

  1. Open Signal and start a direct message
  2. Tap the timer icon (⏱️)
  3. Select a disappearing message duration (30 seconds to 1 week)
  4. Send the password with context

Signal’s encryption ensures only the recipient reads the message. The disappearing feature removes it from both devices after the timer expires. However, Signal lacks file attachment encryption for large credential databases, making it unsuitable for systematic credential management.

Practical Workflow: Secure Credential Rotation

Here’s a workflow combining these tools for regular credential rotation:

#!/bin/bash
# rotate-credentials.sh - Secure credential rotation workflow

# Pull latest password store
cd ~/password-store
git pull origin main

# Generate new API key
NEW_KEY=$(openssl rand -base64 32)
pass insert -m production/api-key <<EOF
Service: AWS Production
Key: $NEW_KEY
Rotated: $(date)
EOF

# Push changes
git add .
git commit -m "Rotate production API key"
git push origin main

# Notify team via Signal (using CLI)
signal-cli send -m "Production API key rotated. Check password store." +1234567890

Key Management Best Practices

Regardless of which encryption tool you choose, follow these principles:

Building Credential Sharing Into Team Culture

Technical tools alone don’t solve credential sharing—team practices matter equally:

No Passwords in Code: Establish a non-negotiable rule that credentials never appear in source code, configuration files, or documentation. Use environment variables and secret management services exclusively.

Audit Access: Track who accessed which credentials and when. This enables detecting unauthorized access and supporting incident investigation:

# Example: Using age audit logging
#!/bin/bash

log_credentials_access() {
    local user=$1
    local credential=$2
    local action=$3

    echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) | $user | $credential | $action" >> ~/credential_access.log

    # Rotate credentials if accessing from unusual location
    if [[ $(hostname) != "office-workstation" ]]; then
        echo "Access from non-standard location: $(hostname)"
    fi
}

# Usage
log_credentials_access "$USER" "db_password_prod" "viewed"

Rotation Discipline: Establish a credential rotation schedule. Many teams have “credential rotation day” monthly or quarterly where all shared credentials are regenerated. This limits the window where stolen credentials provide access.

Integrating Credential Sharing Into CI/CD Pipelines

Developers often need credentials for automated deployment. Implement this safely:

GitHub Secrets: For GitHub-based workflows, use repository secrets:

# .github/workflows/deploy.yml
name: Deploy

on: [push]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Deploy
        env:
          DATABASE_PASSWORD: ${{ secrets.DATABASE_PASSWORD }}
          API_KEY: ${{ secrets.API_KEY }}
        run: ./deploy.sh

GitLab CI/CD Variables: Similarly, GitLab supports protected variables:

# .gitlab-ci.yml
deploy:
  stage: deploy
  script:
    - echo "Deploying with credentials..."
    - ./deploy-app.sh
  variables:
    DATABASE_URL: $DATABASE_URL  # Set in CI/CD Variables
    API_TOKEN: $API_TOKEN
  only:
    - main

These systems mask credential values in logs, preventing accidental exposure in build output.

Credential Sharing for Contractors and Temporary Access

Temporary team members create special challenges:

Time-Limited Credentials: Generate credentials specifically for contractors that expire after the contract ends:

#!/bin/bash
# Generate temporary AWS IAM user for contractor

CONTRACTOR_NAME="jane-doe"
CONTRACT_END_DATE="2026-09-30"

# Create IAM user
aws iam create-user --user-name $CONTRACTOR_NAME

# Attach temporary policy
aws iam attach-user-policy --user-name $CONTRACTOR_NAME \
  --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess

# Set expiration (requires custom Lambda for automatic deletion)
echo "Reminder: Delete $CONTRACTOR_NAME on $CONTRACT_END_DATE"

Separate Credential Scope: Never give contractors access to production databases or payment systems. Create read-only or development-only accounts:

def create_contractor_credentials(contractor_email, access_level="readonly"):
    """Generate limited-scope credentials for contractors"""

    if access_level == "readonly":
        permissions = ["s3:GetObject", "dynamodb:Scan"]
    elif access_level == "development":
        permissions = ["s3:*", "dynamodb:*"]
    else:
        raise ValueError("Invalid access level")

    # Never grant production or payment access
    return generate_iam_credentials(contractor_email, permissions)

Credential Sharing for Multiple Organizations

Developers working across organizations face credential management complexity:

Separate Password Managers: Use completely separate password managers for work credentials versus personal accounts. This prevents a single breach from compromising both.

Alias Email Addresses: Use email aliases for different organizations:

This prevents account enumeration and makes it harder to correlate accounts across organizations.

Incident Response for Credential Leaks

Despite precautions, credentials sometimes leak. Have a response plan:

Detection: Monitor for credential leaks using services like BreachNotification.com or GitHub’s built-in secret scanning. These services alert when credentials appear in public repositories.

Immediate Response:

  1. Immediately revoke the leaked credential
  2. Alert all team members who used that credential
  3. Check logs for any unauthorized access since the leak
  4. Generate a new credential
  5. Document the incident for audit purposes

Post-Incident Analysis:

Cost-Benefit Analysis

Choosing credential management approaches requires understanding tradeoffs:

Approach Cost Security Usability
Shared documents Free Poor Easy
Pass via email Free Very Poor Easy
Age encryption $0/month Excellent Medium
Dedicated password manager $10-50/user/month Good Good
Vault/HashiCorp $1-5/month Excellent Medium

Small teams under 10 people often find age encryption sufficient. Larger teams benefit from dedicated tools. Very large teams (50+) should use enterprise solutions like Vault, AWS Secrets Manager, or HashiCorp Terraform Cloud.

Credential sharing affects compliance:

SOC 2 Type II: Auditors expect documented credential management procedures and access logs. Implement audit trails from day one.

HIPAA (Healthcare): Access to healthcare systems must be logged and audited. Each person must have individual credentials (no shared accounts). Implement the tools and practices described here to demonstrate compliance.

PCI-DSS: Similar to HIPAA, each user needs individual credentials. Shared service accounts violate PCI-DSS requirements.

Document your credential management practices and have legal review them before adopting. Proper documentation during normal operations prevents compliance issues later.

Built by theluckystrike — More at zovo.one