Indicating (shared) interest in things without disclosing what they are
March 5th, 2011 by Terry Jones. Filed under Awesomeness, Essence, Howto, Programming.
Imagine you want wanted to tell the world you were interested in something, for example an email address or a phone number, without telling the world what that thing was. That may not sound so interesting, but if several people were doing the same thing, it would be a mechanism for discovery of private things you had in common, without telling anyone else what those things were.
Russell Manley and I just thought of a simple way to do this using Fluidinfo. Here’s how we did it for the email addresses we know.
For each email address, compute its MD5 sum. Then, put a rustlem/knows or terrycojones/knows tag onto the object whose fluiddb/about value is the MD5 sum. The MD5 algorithm is essentially one-way, so even if someone finds a Fluidinfo object with either of our tags on it (which is trivial) they cannot recover the original email address.
This is pretty nice. We’re independently indicating things of interest, but neither of us is publicly saying what those things are. Because we’re putting our information onto the same objects in Fluidinfo, we can then easily discover things we have in common with each other (and with others), without the world knowing what. We can do the same thing for phone numbers, or anything else.
Getting the data into Fluidinfo was trivial. Here’s code I used to put a terrycojones/knows tag (with value True) onto the appropriate objects:
from fom.session import Fluid
fdb = Fluid()
fdb.login('terrycojones', 'PASSWORD')
for thing in sys.stdin.readlines():
about = hashlib.md5(thing[:-1]).hexdigest()
fdb.about[about]['terrycojones/knows'].put(True)
You pass a list of email addresses to this script on standard input.
Russell and I each had about a thousand email addresses in our address books. A first question is how many addresses we know in common. You can get the answer to this with the simple Fluidinfo query has terrycojones/knows and has rustlem/knows. It turns out there are 53 common addresses. But the results don’t tell us which addresses those are, which is also interesting.
We also wrote a small script to print any tags ending in /knows for a set of email addresses given on the command line.
from fom.session import Fluid
from fom.errors import Fluid404Error
fdb = Fluid()
for thing in sys.argv[1:]:
about = hashlib.md5(thing).hexdigest()
print thing, about
try:
for tag in fdb.about[about].get().value['tagPaths']:
if tag.endswith('/knows'):
print '\t', tag
except Fluid404Error:
print '\tunknown'
So given an email address, we can run the above and see who else knows (or claims to) that email address.
We find all this quite thought provoking. Without going into details of the social side of this, it’s worth pointing out that Fluidinfo makes this kind of information sharing very easy because it has a guaranteed writable object for everything, including all MD5 sums. Because the fluiddb/about tag is unique and isn’t owned by anyone, any user can add their knows tag to the object for any MD5 sum. The ability for users and applications to work independently and yet to share information by just following a fluiddb/about convention is one of the coolest things about Fluidinfo.
Finally, note that this system does not guarantee privacy. If someone already knows an email address or phone number (etc) they can compute its MD5 sum and examine the Fluidinfo tags on the corresponding object. Doing so they might see a rustlem/knows tag and would then be free to draw their own conclusion.
You can play too. All you need is a Fluidinfo account and the above code. Please let us know how you get on. For example, you can freely tweet any MD5 sums we have in common. We’re going to use the hashtag #incommon, like this.
