Хранение секретов — критически важный аспект безопасности приложения. Вот профессиональные подходы, которые я рекомендую после многолетнего опыта:
Самый распространенный способ для разработки:
# .env файл
DB_PASSWORD=supersecret123
API_KEY=abcd1234efgh5678
Использование с dotenv
пакетом:
require('dotenv').config();
const dbPassword = process.env.DB_PASSWORD;
const apiKey = process.env.API_KEY;
Плюсы:
Минусы:
const { SecretsManager } = require('aws-sdk');
async function getSecret() {
const client = new SecretsManager();
const secret = await client.getSecretValue({ SecretId: 'my/db/secret' }).promise();
return JSON.parse(secret.SecretString);
}
const vault = require('node-vault')();
vault.read('secret/data/myapp').then((result) => {
const secrets = result.data.data;
});
Плюсы:
Пример для AWS SSM:
const { SSM } = require('aws-sdk');
const ssm = new SSM();
const param = await ssm.getParameter({
Name: '/prod/myapp/db_password',
WithDecryption: true
}).promise();
const dbPassword = param.Parameter.Value;
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: myapp-secrets
type: Opaque
data:
db.password: BASE64_ENCODED_VALUE
Доступ в приложении через:
const dbPassword = Buffer.from(process.env.DB_PASSWORD, 'base64').toString('ascii');
Для максимальной безопасности (финансовые системы, PCI DSS):
1. **Хранить в коде** (даже в закомментированных участках)
2. **Использовать конфигурационные файлы** (config.json, settings.js)
3. **Отправлять по email/мессенджерам**
4. **Хранить в браузере localStorage**
5. **Использовать простые системы шифрования** (например, base64 — это не шифрование)
Для разных сценариев:
Всегда соблюдайте принцип наименьших привилегий и регулярно ротируйте секреты. Для Node.js особенно важно никогда не логировать секретные значения и использовать process.env только на уровне инициализации приложения.