The problem:
Gravatar hashes are somewhat easy to crack. Websites are super easy to scrape. Sites with Gravatar urls in the img-src or profile link make it trivial to generate lists of hashes to crack. Other data available on sites and in Gravatar profiles can be used to generate targeted wordlists which make cracking a large proportion of the hashes much quicker, in seconds rather than days.
The goal:
Make it so that sites don’t have to use Gravatar’s easily cracked hashes on the front end to get data from Gravatar.
How it currently works:
Gravatar works like this. It’s easiest to look at Matt Mullenweg’s profile (JSON, XML) because he has photos on it other than his avatar and I’ll refer to the structure of those urls.
Currently the profile url is https://en.gravatar.com/767fc9c115a1b989744c755db47feb60.json and the avatar image url is https://secure.gravatar.com/avatar/767fc9c115a1b989744c755db47feb60 where 767fc9c115a1b989744c755db47feb60 is the md5 hash of his email address.
If you look at Matt’s other photos, you’ll see they’re at eg
https://secure.gravatar.com/userimage/5/2873000ea367cd46cae55418e4eac32c
and I’m going to call that last hash in his photo url HASH_OF_FILENAME although I’m not exactly sure what it’s a hash of and the user id (5) USER_ID
What if it worked something like this:
My first thoughts are to tweak and add to what’s already there, so what if these existed and sites could use them?
Gravatar avatar url:
secure.gravatar.com/userimage/USER_ID/HASH_OF_FILENAME
Gravatar profile url:
secure.gravatar.com/userprofile/USER_ID/HASH_TO_PREVENT_ENUMERATION
For the new profile url, you’d still use the usual JSON, XML, PHP responses by adding the appropriate extension. (If you wanted the web profile, it would redirect to the usual one with the username eg en.gravatar.com/matt)
The current profile endpoints would still be there for backwards compatibility. This is because I’m assuming it’s difficult to get rid of something someone might be using but much easier to add something new separately.
The new profile would strip out the unnecessary email hashes so the JSON response from secure.gravatar.com/userprofile/5/HASH_TO_PREVENT_ENUMERATION.json would look like this:
Ok but how do the sites know what those urls are?
One way would be to add in two fields like these to the current profile API response eg (apols for the formatting)