diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/system/RandomIdManager.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/system/RandomIdManager.kt
new file mode 100644
index 0000000000000000000000000000000000000000..15bcaa4cbe95d1e6b928c22f21892a53f2b46b8f
--- /dev/null
+++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/system/RandomIdManager.kt
@@ -0,0 +1,29 @@
+package org.briarproject.mailbox.core.system
+
+import java.security.SecureRandom
+import javax.inject.Inject
+
+private const val ID_SIZE = 32
+private const val ID_HEX_SIZE = ID_SIZE * 2
+
+class RandomIdManager @Inject constructor() {
+
+    private val secureRandom = SecureRandom()
+    private val idRegex = Regex("[a-f0-9]{64}")
+
+    fun getNewRandomId(): String {
+        val idBytes = ByteArray(ID_SIZE)
+        secureRandom.nextBytes(idBytes)
+        return idBytes.toHex()
+    }
+
+    fun isValidRandomId(id: String): Boolean {
+        if (id.length != ID_HEX_SIZE) return false
+        return idRegex.matches(id)
+    }
+
+}
+
+fun ByteArray.toHex(): String = joinToString(separator = "") { eachByte ->
+    "%02x".format(eachByte)
+}
diff --git a/mailbox-core/src/test/java/org/briarproject/mailbox/core/system/RandomIdManagerTest.kt b/mailbox-core/src/test/java/org/briarproject/mailbox/core/system/RandomIdManagerTest.kt
new file mode 100644
index 0000000000000000000000000000000000000000..8542cfcf411bc4da3bb9566a366f50bc8131f9a0
--- /dev/null
+++ b/mailbox-core/src/test/java/org/briarproject/mailbox/core/system/RandomIdManagerTest.kt
@@ -0,0 +1,20 @@
+package org.briarproject.mailbox.core.system
+
+import org.junit.jupiter.api.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertTrue
+
+class RandomIdManagerTest {
+
+    private val randomIdManager = RandomIdManager()
+
+    @Test
+    fun `generated IDs are considered valid`() {
+        for (i in 0..23) {
+            val id = randomIdManager.getNewRandomId()
+            assertEquals(64, id.length)
+            assertTrue(randomIdManager.isValidRandomId(id))
+        }
+    }
+
+}