[zeromq-dev] Identities as cookies
Oliver Smith
oliver at kfs.org
Fri May 13 10:11:46 CEST 2011
I'm not sure I've 100% understood identities correctly, or maybe I
have... I'd like to use identities as a sort of validated login cookie
to make associating incoming data with a connection a wee bit easier,
something like:
import zmq ; zc = zmq.Context(1)
# Perform authentication.
sockAuth = zc.socket(zmq.REQ)
sockAuth.connect(authenticatorUri)
sockAuth.send(fancySchmancyEncryptedCredentials)
reply = sockAuth.recv()
sockAuth = None
if not reply or reply == "Go away":
# If this was real code, the message would be far sillier.
raise Exception("Login denied, or something. Possibly cake.")
# Obviously, sending the sessionId in plain text like this
# would be a bad idea, but I only want to write so much
# pseduo code. Writing comments, that I could do all day...
sessionId = reply.sessionId
# Now log in to the service.
sockSvc = zc.socket(zmq.XREQ)
sockSvc.setsockopt(zmq.IDENTITY, sessionId)
sockSvc.connect(reply.serviceUri)
sockSvc.send("Hello! You may recall me from such credentials as " + fancySchmancyEncryptedCredentials + random.random())
reply = sockSvc.recv()
if reply[:8] != "Biscuits":
raise Exception("Should have gone with the cake :(")
# I wish I hadn't opened with a mention of cookies...
return sockSvc, reply[8:]
If cookies work the way I think, the only issue with this would be the
vulnerability to MITM injection?
If that's the case, my thinking is that the session ID + initial
[encrypted, not clear] exchange would double as the initial
application-level component for crypto seeding.
That would [effectively] prevent a different application instance or
imposter or bug causing a different connection to correctly communicate
as that identity, but would it also prevent the genuine application from
re-establishing the same tcp connection in the case of intermediate
network failure? e.g.
sock, seed = aboveCode()
sock.send(encryptedMsg)
system "ifconfig eth0 down"
sleep(30)
system "ifconfig eth0 up"
response = sock.recv()
If this is all sounding feasible...
- How would I poke ZeroMQ to give me a specific delivery tolerance?
sock.setsockopt(zmq.TIMEOUT, 30 * 1000)
- Is there a way to tell the XREP socket on the server to flush any
backlog/close the underlying tcp socket associated with a particular
identity?
serverSideSock = zc.socket(zmq.XREP)
...
def noMoreCakeFor(identity):
serverSideSock.setsockopt(zmq.DISCONNECT_IDENTITY, identity)
- Most importantly, where and how much overhead does the identity
impose across a single ZMQ-hop?
client <----wan-but-no-devices---> server
Is it only in the handshaking? Is it repeated periodically? Or
is it a per-message overhead?
- Oliver
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20110513/b836ef13/attachment.htm>
More information about the zeromq-dev
mailing list