# Identity Challenge Protocol
Jan 20, 2025
In a world where digital impersonation is trivially easy, how do you prove you're really you? After years of dealing with identity verification, I've developed a robust challenge-response system that actually works. Here's how it works and why it matters.
Most identity verification online is laughably weak. Email confirmation, phone number verification, all trivial to spoof. We need something stronger, something that cryptographically proves identity while being practical enough to actually use.
## The Challenge Protocol
The real power comes from combining three key elements:
**UUID Challenge Stack**
Three random UUIDs provide a massive search space (2^122 possibilities) while remaining simple to verify. That's 5.3×10^36 possibilities - more than enough to make brute force attacks impractical. This isn't about making verification complex - it's about making impersonation mathematically impossible.
**Platform-Specific Response**
By requiring responses on specific platforms with specific usernames, we prevent man-in-the-middle attacks where imposters simply relay challenges to the real identity holder. This creates a physical anchor point - a specific communication channel that must be controlled by the real identity holder. This isn't just about cryptography - it's about understanding attack vectors.
**Temporal Validation**
Timestamp requirements prevent replay attacks and limit the window of vulnerability. I typically consider challenges valid for up to 48 hours from the timestamp - long enough to be practical but short enough to prevent meaningful replay attacks. While specialists might focus solely on cryptographic security, this system acknowledges that time itself is a security parameter.
## Sending a Challenge
The challenge process involves two key steps:
### Step 1. Preparing the Challenge
**Create Your Challenge Message**
1. [Generate three random UUIDs](https://www.uuidtools.com/api/generate/v4/count/3) using a secure generator.
2. Choose your preferred communication platform and username.
3. Get the current epoch timestamp.
4. Fill out the challenge template with your information.
**Challenge Template**
```plaintext
I want to verify that you're actually char (@cunjur). Therefore, I've encrypted this message using your public key.
I've chosen a random secret that only you'll be able to reveal by decrypting this message with your access card's private key.
The random secret is simply three randomly generated UUIDs, which I've saved locally so I can verify them later:
[YOUR THREE UUIDs]
Because anyone impersonating you can simply send this message to you and then pass your response to them along to me, please make sure you only respond to this challenge from the following username/platform:
[YOUR USERNAME/PLATFORM]
The current epoch time is [CURRENT EPOCH TIME]. I understand that you won't reply to this message if there's too much time between the time this message was encrypted and the time you receive it.
I also understand that if there's malware on my computer at the time of me encrypting this message, it's possible a bad actor may already have the plaintext version of this message.
```
### Step 2. Encrypt the Message
**For PGP Experts**
1. Use my public key to encrypt your challenge.
2. Save the encrypted message as `challenge.txt`.
3. Send it via your specified platform or share through Gist.
**For PGP Beginners**
1. Visit [pgp.help](https://pgp.help/#/permalink?pgp=-----BEGIN%20PGP%20PUBLIC%20KEY%20BLOCK-----%0D%0AVersion:%20OpenPGP.js%20v1.5.7%0D%0AComment:%20https:~2F~2Fpgp.help%0D%0A%0D%0AxsFNBGeNibsBEADC7xBZBisWHtGlI5~2FU%2BPpTbheTE0vh89u%2BaR3H67WVKAgV%0ALywseMvRBY7iKZpAHoyaY3IPU4CU8kVH5F%2B88VUJvHpcxtv6uT6tFmInkTF3%0A%2BXt5khl~2FTkBq0aiqwZrO%2BcxmRPhcV89reA6Z~2FNidYIuPp5N6byQxT8%2Bps1GR%0AlNimGWeR3z4V4NrHA8DtvTCvar9cc4jHFNG4zFJVySevQWWBwIAqo9~2FC%2By8z%0AYPNhfzmJf9ow84EE2heKYgi%2B~2FwinquWx7Xd8oz%2BpQPKP%2Bt72%2BBPLQgmJw1eN%0A1c4WwE~2FvwgchMVlQmU4wB5jfuOdd0ECKIGmEaBWsVc5QnIHn5Awc74X7BSbi%0A2IFN0GIl7CeQeucfO9%2BM8q2pqxVBTtU4c1ElnjM~2FpdZ4IzbwmYE71uEmZG7D%0AhkEcUAzUISQkPfPXUQ8Imr80Gcj5PTfyGJ3VdRkVN1mrD63qmLyHC4L9N1jk%0AR~2FtNLizKI~2FaepAAosLmkXUS3Fyn7tE51Yt5TR8Si~2FrsTFjFiGekzV6U7E8gm%0AVT9Csz4rswidiDgkCAe9hw321oc5E9HXhwkm2BPPAIRbE4zJTDaU8mQS31Q4%0A~2FSdE4UicNoP1rjJfSS8HIcMuh%2BEeQu9XqlGGm%2Bc55ZEFh~2Fp~2FIW%2BhOkLi1a9w%0A6jQ1wxXdBPlhq~2FT0et%2B1fWUzeRiZfYaYgEEPpwARAQABzRVjaGFyIDxjaGFy%0AQGNoYXIuYmxvZz7CwZMEEwEKAD0WIQT9mTrV0T02yOhht876hbift6UPqgUC%0AZ42JuwIbAwUJCWayhQQLCQoEBRUKCQgDBRYCAwEAAh4FAheAAAoJEPqFuJ%2B3%0ApQ%2BqjVYP~2FR0VuLbNTlS3cYkElWaaN2q3kUaeCSmukTmNHHL21ZcuV8saQzqd%0AG5evwWRoxPkxtz5wa%2BOuWQJvaj8qJgoiJ9dUeFA1CzgC6afB5ZidvP62iZw5%0AE2qGbCEmlekL08SnZn8HNHQzE8mOwhNNgtbeNlh%2B2jwwiwLSr8~2Fh1zZ6L~2Fk8%0Atp%2BUHWwmYwcE1Ifamimmk6%2BADs6Y9Zu%2B9oxkYwWmpU7oZkw86brZ6gD7jRbP%0AkcQEShMpsLarRFLJA~2FulgAorcTBC929eWPIZiPnW12yyM6VAimnYRW7TGjHr%0Ajp88eZjO4p~2F1syDLL9wsvwz4x0jHkj%2BvZ~2FixGT91JPoejE7eouZpP8EyHj1b%0ALvGF%2BeX~2FzZ7QzTVgbchvl1dfS553mp7EoJwUkHwgDqSHu2qIQSkB4V8tYLL2%0AlkKYJp3dsS5%2BgUflUTj%2BGGKTqmeYqrpMZXObQtUCt53KljaUgPPAMltvBeno%0AQ4YOrZ0Kod8ERasz7eVnRZce0VUm4AkArMdZ3uKHn0DuuvGc4vjqozWYSKfq%0ASvrcBXbqVGB4hW1EikAvlgwk~2FnEfZxv8KZub3OIZmD9BsgPiT9LjhOti0Cih%0Ahf9TJ%2BBjREKf7w~2FF5nL%2BwPVtYHo%2BaZ3xwwEsXGOZEIMljTPh9dK~2FrUFUgZY3%0AJNvmRgN2QySouVyz~2FZlGqfkX2sEvSN17zsFNBGeNibsBEACudziH%2BXlUCxh8%0AXRyEDYqr5pzL6qbWS8nIZRN3w5pGvKGwx1Kio1umbB8xO7CJjosZzcvbcszI%0AuhclWo1Ogb3g7etEfWjk7p~2F5AJ0fi2j2x~2FIdkSZ3JO806mGqL5MPMn2GQOvQ%0AXVbsh3IcHNjRo~2Fd7DzG1h2Y7kmUqA1D%2Bu7KOS6kwlJwcq2IAhCoxIj8x8xnu%0AOZpQpBADouGZBQY%2BW3FltIKluPQqDs5M1c1qdWRXPzgGzsbG~2F5a7LWF2mP1U%0AHzSpVPN9IQ3jYgtJfL8KgKjjw2VHbeFvfrnISiTGGAteJ3PkQyoXrXmSqETG%0Ag697jYf1faoMO0%2BwXauJL07MQ3w2tpmZj3abQOl6okhnI8ABC57kO1v3iVlG%0AQJbTZKdL6tOhwoAl0NnenjiRQn1T~2Fbt6Zm5wKWjH1LlZnZ195Ydid8jUrxlQ%0AmWWSKB3PTwWh1xtRw07rnzRMXkhFzocBl7gI%2BfMkPfrNJhrZOB%2B3O6whacOe%0A~2FRfn9XVf9J0iejVbkRByfRvP08yoDitRfyJZdHIk6Rke0nq7NBshuPH55HX3%0A37ipvxVlMNBgi7S5CrvttdHRfOHj~2FZvbXn57CakyuqqEcJMdEdLKf7gja6PO%0AXNSjqBKCH0fpdhVz8QhAZOotvM3gHVj9PNyL0rPc7fg5aTUlk9Ev4cvF3LED%0AJQujwF0jRQARAQABwsF8BBgBCgAmFiEE~2FZk61dE9NsjoYbfO%2BoW4n7elD6oF%0AAmeNibsCGwwFCQlmsoUACgkQ%2BoW4n7elD6pmSg~2F~2FcsUlahPAa7MVqI64jt7t%0A8pI~2FBXOb5pNNXJ2Nmluc~2FpJFHLBAx73RJR6hWyKgwmJBc9sl7GqogLZLJ8Bn%0AsWdfhZlwfOBFB6KWFYZTZ85UgHlj55mAgV3WkYZW%2BU1cDEQZTDJmi7zVaA97%0AopiLo7Q1MWpmpEKLZhIiQBJgK3JjD1AS4p2cUkD6MFcVu8wmhpTnar2FzxcB%0AZx86N~2F6us%2BMe3Z~2F6TecLUS7DlEPl08uFcuaP9p0xnCaEcO9g0~2FmGxrpKHNrD%0A70O~2FIQmXh3sg2cug4WcmEpf8MFcLHAFO1nMy3FLZcxde%2BZEKyZDuK26JcZga%0AoMUN54OT6dxYCu9EsX%2BpyZl8w0oNURGLbI515zq%2B72~2Fhi7pNSbOwcw4SIh2S%0AZYtUinipCWhvJgSP%2B5Ku9vhuyRPzWtLwVCOsc~2FxooVH1f9JdDq79XSY1j0Pk%0A5YbhiE4UUZXW2rZJCzLs0gdhFfvTstLSubljYD9C8z8muYUgydZGkJrqNRv~2F%0AV7dUhinMUImYX4DZ8uRMkJqAN4DIjYXarefzR9VeA4MNlMf6iGEUjH2PLz0I%0A3%2BUjkSvxYYN0kJmuPbsfzvs0paWOiY7uinki1dXavBNDrL%2BFg3a3VNFWJRGQ%0APxd1aqOvWw9seAuok%2BVRinyCyGdYhTwmTbM4TFVVBom9CblKhvxqLOkxVhOp%0ApkU%3D%0D%0A%3DezMJ%0D%0A-----END%20PGP%20PUBLIC%20KEY%20BLOCK-----%0D%0A%0D%0A) and verify the following security header is present:
```
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'self'; style-src 'self'; font-src 'self'; img-src 'self';">
```
This header ensures your data stays local and isn't transmitted over the internet.
2. Import my public key (it will auto-copy, or find it in my [Gist](https://gist.githubusercontent.com/name/07efd0559c0cddfce649fee22eaac0a9/raw/0dcfaa37bc73e5bacca1b2c000967119bae95deb/pgp.asc)).
3. Paste your challenge message.
4. Copy the encrypted output.
5. Save as `challenge.txt` and send.
Always save your UUIDs locally - you'll need them to verify my response.
**Why Native PGP is Better**
While web-based tools like pgp.help are convenient, native PGP implementations offer:
- Complete offline operation.
- Better key management.
- Reduced attack surface.
- Integration with your operating system.
**Recommended PGP Tools**
- Linux: [GnuPG](https://www.gnupg.org/).
- Windows: [Gpg4win](https://www.gpg4win.org/).
- macOS: [GPG Suite](https://gpgtools.org/).
- All platforms: [Kleopatra](https://www.openpgp.org/software/kleopatra/).
### Security Considerations
If I claim I "can't respond to the challenge" or give any excuse for not providing your secrets (except as specifically outlined above), you can be sure you're not actually talking to me.
While this system is robust, it's worth noting that an attacker could theoretically retrieve your secrets without my private key. Here's how:
1. Compromising the UUID generator - possible but unlikely, and difficult to determine which secrets were actually used.
2. Attacking pgp.help - more feasible, but prevented by verifying the Content-Security-Policy header. Using native PGP implementations like Gpg4win eliminates this risk entirely.
3. Malware on your device - the most practical attack vector, as it could capture data pre-encryption or access locally saved secrets.
4. Nation-state level attacks - if you're dealing with this, you've got bigger problems...
Despite these theoretical attack vectors, this system has proven reliable in practice for 4-5 years of daily use.
## A Real-World Example
During a recent identity challenge, this system proved its worth:
1. The challenger generated three random UUIDs and specified Discord as the response platform.
2. They encrypted the challenge using my public PGP key.
3. I decrypted and verified the timestamp was recent.
4. I responded only through the specific Discord account.
5. The challenger verified the UUIDs matched their saved values.
This kind of challenge perfectly illustrates how multiple security domains work together:
- Cryptography provides the foundation.
- Platform specificity prevents relay attacks.
- Temporal validation stops replay attacks.
- UUID verification makes brute force impractical.
## The Implementation
The beauty of this system is its simplicity. No complex infrastructure, no trusted third parties, just:
1. PGP for asymmetric encryption.
2. UUIDs for challenge tokens.
3. Platform specificity for response validation.
4. Timestamp checking for temporal security.
### Handling Failure Modes
**Timestamp Validation:**
- Challenges older than 48 hours are automatically rejected.
- If your challenge times out, simply generate a new one with a fresh timestamp.
- Always use current epoch time, not future timestamps.
**Platform Verification:**
- Only accept responses from the exact username specified (including discriminators).
- Verify the response comes through the platform's official channels.
- If the platform is unavailable, wait for it to return rather than accepting alternate channels.
**Challenge Failures:**
- If UUIDs don't match: The response is invalid, and you're likely not talking to me.
- If the response comes from wrong platform/username: Reject it immediately.
- If decryption fails: The message was tampered with or not encrypted with my public key.
The goal isn't perfect security - it's practical identity verification that's strong enough to be useful while simple enough to actually use.
Your identity verification becomes exponentially more reliable when you stop treating it as just a cryptographic problem and start thinking about the entire attack surface.