Skip to content

Commit

Permalink
Fix encryption logic (twentyhq#4672)
Browse files Browse the repository at this point in the history
Co-authored-by: Thomas Trompette <[email protected]>
  • Loading branch information
thomtrp and Thomas Trompette authored Mar 26, 2024
1 parent d4eb75a commit f08dfec
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 30 deletions.
44 changes: 21 additions & 23 deletions packages/twenty-server/src/engine/core-modules/auth/auth.util.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
import { createCipheriv, createDecipheriv, createHash } from 'crypto';
import {
createCipheriv,
createDecipheriv,
createHash,
randomBytes,
} from 'crypto';

import * as bcrypt from 'bcrypt';

Expand All @@ -16,41 +21,34 @@ export const compareHash = async (password: string, passwordHash: string) => {
return bcrypt.compare(password, passwordHash);
};

export const encryptText = (
textToEncrypt: string,
key: string,
iv: string,
): string => {
export const encryptText = (textToEncrypt: string, key: string): string => {
const keyHash = createHash('sha512')
.update(key)
.digest('hex')
.substring(0, 32);

const ivHash = createHash('sha512').update(iv).digest('hex').substring(0, 16);
const iv = randomBytes(16);

const cipher = createCipheriv('aes-256-ctr', keyHash, ivHash);
const cipher = createCipheriv('aes-256-ctr', keyHash, iv);

return Buffer.concat([cipher.update(textToEncrypt), cipher.final()]).toString(
'base64',
);
return Buffer.concat([
iv,
cipher.update(textToEncrypt),
cipher.final(),
]).toString('base64');
};

export const decryptText = (
textToDecrypt: string,
key: string,
iv: string,
): string => {
export const decryptText = (textToDecrypt: string, key: string): string => {
const textBuffer = Buffer.from(textToDecrypt, 'base64');
const iv = textBuffer.subarray(0, 16);
const text = textBuffer.subarray(16);

const keyHash = createHash('sha512')
.update(key)
.digest('hex')
.substring(0, 32);

const ivHash = createHash('sha512').update(iv).digest('hex').substring(0, 16);
const decipher = createDecipheriv('aes-256-ctr', keyHash, iv);

const decipher = createDecipheriv('aes-256-ctr', keyHash, ivHash);

return Buffer.concat([
decipher.update(Buffer.from(textToDecrypt, 'base64')),
decipher.final(),
]).toString();
return Buffer.concat([decipher.update(text), decipher.final()]).toString();
};
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,6 @@ export class RemoteServerService<T extends RemoteServerType> {
const encryptedPassword = await encryptText(
remoteServerInput.userMappingOptions.password,
key,
// TODO: check if we should use a separated IV
key,
);

remoteServerToCreate = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,7 @@ export const buildPostgresUrl = (
const foreignDataWrapperOptions = remoteServer.foreignDataWrapperOptions;
const userMappingOptions = remoteServer.userMappingOptions;

const password = decryptText(
userMappingOptions.password,
secretKey,
secretKey,
);
const password = decryptText(userMappingOptions.password, secretKey);

const url = `postgres://${userMappingOptions.username}:${password}@${foreignDataWrapperOptions.host}:${foreignDataWrapperOptions.port}/${foreignDataWrapperOptions.dbname}`;

Expand Down

0 comments on commit f08dfec

Please sign in to comment.