Identifier Obfuscation
On this page
The obfuscation process transforms a plaintext identifier into a privacy-preserving on-chain identifier.
Step-by-Step Process
1. Format the Identifier
Combine the identifier prefix with the plaintext identifier:
formatted = "{prefix}://{plaintextIdentifier}"
Example:
Phone: "tel://+12345678901"
Twitter: "twit://@alice"
2. Hash the Formatted Identifier
hashedIdentifier = sha3(formatted)
3. Blind the Hash
The client generates a random blinding factor and blinds the hash:
blindedHash = blind(hashedIdentifier, blindingFactor)
This step ensures ODIS cannot see the actual identifier.
4. Query ODIS
Send the blinded hash to ODIS operators.
5. ODIS Processing
Each ODIS operator:
- Receives the blinded hash
- Computes a partial signature using their key share
- Returns the blinded partial signature
6. Combine Signatures
When k signatures are received:
- Signatures are combined into a full signature
- This is the “blinded pepper signature”
7. Unblind the Signature
The client unblinds the signature:
unblinedSignature = unblind(blindedPepperSignature, blindingFactor)
8. Generate the Pepper
Extract the pepper from the unblinded signature:
pepper = first13Chars(sha256(unblindedSignature))
9. Create Obfuscated Identifier
Combine the hashed identifier with the pepper:
obfuscatedIdentifier = sha3(hashedIdentifier + "__" + pepper)
Final Formula:
obfuscatedIdentifier = sha3(sha3("{prefix}://{plaintext}") + "__" + pepper)
In practice, the SDK wraps this entire process in a single OdisUtils.Identifier.getObfuscatedIdentifier call. See SDK Integration with Viem.
Verification
Results from ODIS can be verified against the service’s public key, which is shared with users through the client library.
Thanks — what went wrong?
Thanks for your feedback!