From f81369d6437789fc0d86adc5cae34ae1385cab05 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 27 Mar 2026 14:33:52 +0200 Subject: [PATCH] feat(core): support md5 hash --- apps/client-standalone/package.json | 1 + .../src/lightweight/crypto_provider.ts | 12 ++++++++++-- apps/server/src/crypto_provider.ts | 2 +- apps/server/src/services/utils.ts | 5 ----- .../trilium-core/src/services/encryption/crypto.ts | 2 +- packages/trilium-core/src/services/utils/index.ts | 5 +++++ pnpm-lock.yaml | 12 ++++++++++++ 7 files changed, 30 insertions(+), 9 deletions(-) diff --git a/apps/client-standalone/package.json b/apps/client-standalone/package.json index 9e72dc5357..dc06104c1f 100644 --- a/apps/client-standalone/package.json +++ b/apps/client-standalone/package.json @@ -46,6 +46,7 @@ "i18next-http-backend": "3.0.2", "jquery": "4.0.0", "jquery.fancytree": "2.38.5", + "js-md5": "0.8.3", "js-sha1": "0.7.0", "js-sha256": "0.11.1", "js-sha512": "0.9.0", diff --git a/apps/client-standalone/src/lightweight/crypto_provider.ts b/apps/client-standalone/src/lightweight/crypto_provider.ts index 0acfc1944c..0d1a6d8066 100644 --- a/apps/client-standalone/src/lightweight/crypto_provider.ts +++ b/apps/client-standalone/src/lightweight/crypto_provider.ts @@ -2,6 +2,7 @@ import type { CryptoProvider } from "@triliumnext/core"; import { sha1 } from "js-sha1"; import { sha256 } from "js-sha256"; import { sha512 } from "js-sha512"; +import { md5 } from "js-md5"; interface Cipher { update(data: Uint8Array): Uint8Array; @@ -15,11 +16,18 @@ const CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; */ export default class BrowserCryptoProvider implements CryptoProvider { - createHash(algorithm: "sha1" | "sha512", content: string | Uint8Array): Uint8Array { + createHash(algorithm: "md5" | "sha1" | "sha512", content: string | Uint8Array): Uint8Array { const data = typeof content === "string" ? content : new TextDecoder().decode(content); - const hexHash = algorithm === "sha1" ? sha1(data) : sha512(data); + let hexHash: string; + if (algorithm === "md5") { + hexHash = md5(data); + } else if (algorithm === "sha1") { + hexHash = sha1(data); + } else { + hexHash = sha512(data); + } // Convert hex string to Uint8Array const bytes = new Uint8Array(hexHash.length / 2); diff --git a/apps/server/src/crypto_provider.ts b/apps/server/src/crypto_provider.ts index c32f301797..5643b9ecf4 100644 --- a/apps/server/src/crypto_provider.ts +++ b/apps/server/src/crypto_provider.ts @@ -6,7 +6,7 @@ const randtoken = generator({ source: "crypto" }); export default class NodejsCryptoProvider implements CryptoProvider { - createHash(algorithm: "sha1", content: string | Uint8Array): Uint8Array { + createHash(algorithm: "md5" | "sha1" | "sha512", content: string | Uint8Array): Uint8Array { return crypto.createHash(algorithm).update(content).digest(); } diff --git a/apps/server/src/services/utils.ts b/apps/server/src/services/utils.ts index db7b4d38f9..789f8af3d3 100644 --- a/apps/server/src/services/utils.ts +++ b/apps/server/src/services/utils.ts @@ -25,10 +25,6 @@ export function randomString(length: number): string { return coreUtils.randomString(length); } -export function md5(content: crypto.BinaryLike) { - return crypto.createHash("md5").update(content).digest("hex"); -} - /** @deprecated */ export function hashedBlobId(content: string | Buffer) { return coreUtils.hashedBlobId(content); @@ -177,7 +173,6 @@ export default { isMac, isStringNote, isWindows, - md5, newEntityId, normalize, quoteRegex, diff --git a/packages/trilium-core/src/services/encryption/crypto.ts b/packages/trilium-core/src/services/encryption/crypto.ts index 4f747dd9c6..0f3c54dddb 100644 --- a/packages/trilium-core/src/services/encryption/crypto.ts +++ b/packages/trilium-core/src/services/encryption/crypto.ts @@ -5,7 +5,7 @@ interface Cipher { export interface CryptoProvider { - createHash(algorithm: "sha1" | "sha512", content: string | Uint8Array): Uint8Array; + createHash(algorithm: "md5" | "sha1" | "sha512", content: string | Uint8Array): Uint8Array; randomBytes(size: number): Uint8Array; randomString(length: number): string; createCipheriv(algorithm: "aes-128-cbc", key: Uint8Array, iv: Uint8Array): Cipher; diff --git a/packages/trilium-core/src/services/utils/index.ts b/packages/trilium-core/src/services/utils/index.ts index 0a73c6b8e3..ec64a693f5 100644 --- a/packages/trilium-core/src/services/utils/index.ts +++ b/packages/trilium-core/src/services/utils/index.ts @@ -20,6 +20,11 @@ export function hash(text: string) { return encodeBase64(getCrypto().createHash("sha1", text.normalize())); } +export function md5(content: string | Uint8Array) { + const bytes = getCrypto().createHash("md5", content); + return Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join(""); +} + export function isStringNote(type: string | undefined, mime: string) { return (type && STRING_NOTE_TYPES.has(type)) || mime.startsWith("text/") || STRING_MIME_TYPES.has(mime); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 123ff9f72b..8b9940114e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -507,6 +507,9 @@ importers: jquery.fancytree: specifier: 2.38.5 version: 2.38.5(jquery@4.0.0) + js-md5: + specifier: 0.8.3 + version: 0.8.3 js-sha1: specifier: 0.7.0 version: 0.7.0 @@ -11173,6 +11176,9 @@ packages: resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} engines: {node: '>=0.10.0'} + js-md5@0.8.3: + resolution: {integrity: sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==} + js-sha1@0.7.0: resolution: {integrity: sha512-oQZ1Mo7440BfLSv9TX87VNEyU52pXPVG19F9PL3gTgNt0tVxlZ8F4O6yze3CLuLx28TxotxvlyepCNaaV0ZjMw==} @@ -17650,6 +17656,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.6.1 '@ckeditor/ckeditor5-utils': 47.6.1 ckeditor5: 47.6.1 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-inspector@5.0.0': {} @@ -17660,6 +17668,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.6.1 '@ckeditor/ckeditor5-utils': 47.6.1 ckeditor5: 47.6.1 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-line-height@47.6.1': dependencies: @@ -29147,6 +29157,8 @@ snapshots: js-levenshtein@1.1.6: {} + js-md5@0.8.3: {} + js-sha1@0.7.0: {} js-sha256@0.11.1: {}