Nanjing Taxi is a relatively secure distributed P2P chat system. It uses a distributed hash table in the form of a Kademlia network to "host" chatrooms. Clients connect to the network to find a chatroom. Once a client finds its chatroom, the connections in the chatroom is separate from the Kademlia network.
I have been made to understand that this system is extremely similar to the one proposed by the BitTorrent team - BitTorrent Chat. The basic idea is similar.
The way Nanjing Taxi works is like this:
- Client connects to a Kademlia network
- Client joins/creates a room
- If client creates a room: a. Client will store the room ID in the Kademlia network, allowing the room to be found b. Client will generate keys (public, private and member) c. Clent will facilitate key exchange
- If client joins a room: a. Client will be provided with a member key and a public key by someone trusted b. Client will request a room from a node in the Kademlia network that is part of the room c. Said node will issue a challenge to client. d. Client will respond to the challenge e. If response is valid, the room's private key is distributed to the Client, allowing Client to create invites.
This is how the network looks like after a node joins the Kademlia network. We're the blue node on the lower right. Blue nodes are participants of a chatroom.
This is how the network looks like after the node requests a chatroom. All the nodes in the chatroom are now connected separately from the Kademlia network.
user@host: ~/location/of/project$ go build .
user@host: ~/location/of/project$ ./nanjingtaxi <kademlia port> <chatroom port>
These are the commands available. Follow the prompts after typing in the commands
- cx - connect to a kademlia network
- nodes - check the nodes in the kademlia network
- self - introspection. See stuff about this node
- ls - list the number of chatrooms this client is in
- new - create a new chatroom
- join - join a chatroom
- invite - create invite to a chatroom
- send - send message to a chatroom
If you're creating a room:
./nanjingtaxi 13370 12345
- 13370 is the port that will be used to connect to Kademlia. 12345 is the communications port.cx
- issues a connection command. A prompt for the target IP will come up. You need to know an IP:Port combination that is already on the Kademlia networknew
- creates a new room. It will prompt you for a user friendly name for the room. Then it will generate 3 keys: chatrooms/_public.pem, chatrooms/_private.pem and keys/_member.pem. These keys are used for challenge-replies- To invite people to the room,
invite
. It will generate 2 keys: invites/_member.pem and invites/_public.pem. Distribute this key to the person you're inviting (preferably in a secure manner).
If you're joining a room:
./nanjingtaxi 13370 12345
cx
- Place the given _public.pem file in the
chatrooms/
directory. _member.pem is to be placed inkeys/
. join
- supply the room ID, authentication will be done and you'll be ready to chat.
To chat:
send
- follow the prompts, enter the room ID.
Room IDs are UUID4s.
- Ubuntu 12.04
- OS X 10.9
- Ubuntu 13.10
- Ubuntu 14.04
- I don't think the private key transmission is too secure
- Works on simple LANs. Untested on more complex network structures.
- No UDP firewall punching, NAT traversal and the like
- Crappy interface.
- Doesn't have an indication of who sent the message, just the message (easily rectified).
- Why is it called Nanjing Taxi? It's because I was inspired by a rather ridiculous taxi driver who juggled 4 different communication networks while driving me in Nanjing. I wrote a write up to this app here: The Nanjing Taxi
- Why do you think this is cool? I like distributed stuff. The lack of a need for a central server? No logins? What's not to like.
- Why is this useful? I don't know. Do you ever have a need to securely communicate with other people?
- Will there be improvements to this? Like NAT traversal and stuff? You know, to make it useful? I am not sure and I cannot commit to a schedule. My life is kinda hectic right now. Feel free to send a pull request.
- Your code sucks, well, I wrote it in a hotel room during my holiday. It's a hackjob. Of course there are no tests.
This code is open source. Please feel free to hack on it, and if you want to contribute, send a pull request. It's MIT licenced.