Skip to content

Commit 1f015f4

Browse files
testing encryption
1 parent 20d560e commit 1f015f4

File tree

5 files changed

+61
-0
lines changed

5 files changed

+61
-0
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@
102102
"class-variance-authority": "^0.7.0",
103103
"clsx": "^2.1.0",
104104
"cmdk": "^1.0.0",
105+
"crypto": "^1.0.1",
105106
"crypto-js": "^4.1.1",
106107
"d3-scale": "^4.0.2",
107108
"date-fns": "^3.3.1",

pnpm-lock.yaml

+9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/app/(dynamic-pages)/(authenticated-pages)/(application-pages)/project/[projectSlug]/(specific-project-pages)/tfvars/page.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ export default async function TFVarsPage({ params }: { params: unknown }) {
2626
const { projectSlug } = projectSlugParamSchema.parse(params);
2727
const project = await getSlimProjectBySlug(projectSlug);
2828
const tfvars = await getTFVarsByProjectId(project.id);
29+
const MASTER_PASSWORD = process.env.MASTER_PASSWORD || 'digger-password';
30+
const ENCRYPTION_SALT = process.env.ENCRYPTION_SALT || 'digger-salt';
2931

3032
return (
3133
<div className="flex flex-col space-y-4 max-w-5xl mt-2">

src/data/admin/encryption.ts

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import {
2+
createCipheriv,
3+
createDecipheriv,
4+
pbkdf2Sync,
5+
randomBytes,
6+
} from 'crypto';
7+
8+
function deriveKey(password: string, salt: string): Buffer {
9+
return pbkdf2Sync(password, salt, 100000, 32, 'sha256');
10+
}
11+
12+
function encrypt(
13+
text: string,
14+
ENCRYPTION_SALT: string,
15+
MASTER_PASSWORD: string,
16+
): { iv: string; encryptedData: string } {
17+
const iv = randomBytes(16);
18+
const key = deriveKey(MASTER_PASSWORD, ENCRYPTION_SALT);
19+
const cipher = createCipheriv('aes-256-cbc', key, iv);
20+
let encrypted = cipher.update(text, 'utf8', 'hex');
21+
encrypted += cipher.final('hex');
22+
return {
23+
iv: iv.toString('hex'),
24+
encryptedData: encrypted,
25+
};
26+
}
27+
28+
function decrypt(
29+
iv: string,
30+
encryptedData: string,
31+
ENCRYPTION_SALT: string,
32+
MASTER_PASSWORD: string,
33+
): string {
34+
const key = deriveKey(MASTER_PASSWORD, ENCRYPTION_SALT);
35+
const decipher = createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
36+
let decrypted = decipher.update(encryptedData, 'hex', 'utf8');
37+
decrypted += decipher.final('utf8');
38+
return decrypted;
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CREATE TABLE encrypted_env_vars (
2+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
3+
project_id UUID NOT NULL,
4+
name VARCHAR(255) NOT NULL,
5+
encrypted_value BYTEA NOT NULL,
6+
iv BYTEA NOT NULL,
7+
created_at TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL,
8+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL,
9+
FOREIGN KEY (project_id) REFERENCES projects (id) ON DELETE CASCADE
10+
);

0 commit comments

Comments
 (0)