Securing ZeroMQ: CurveZMQ protocol and implementation
hintjens.com
hintjens.com
However, CurveZMQ drops a number of CurveCP features that are deemed unimportant in the context of the ZMQ environment (to do with session handling in UDP). Maybe that's fine ... maybe it's not. Software in general has the annoying characteristic of spooky second-order effects appearing from "totally unrelated" local changes; in security those second-order effects are quickly found and exploited.
Meanwhile the Salt Stack guys seem to have stitched together some common crypto primitives into something workable, but ... again, I'm unclear about that. There are so many ways to fuck up a crypto protocol -- I recently spent three months iterating one and the final design was as far from the original as oranges from unicorns.
One of the beauties of sticking with TLS, for all its inconvenience at times, it that is under constant scrutiny.
Security is one area where Linus's Law really does seem to apply.
While it's good, it has a number of weaknesses that CurveCP addresses, and which CurveZMQ includes. The parts of CurveCP that we don't implement are quite specifically to do with traffic control over UDP, name resolution, etc. and not security.
The second problem with Salt's security is that it's not inside 0MQ but layered on top. This has a number of consequences such as interoperability and reusability.
Our goal with CurveZMQ is to put this into the 0MQ kernel so it's available across all socket types. It will work over PUB-SUB as well as ROUTER-DEALER or PUSH-PULL. It will work over any intermediaries and since it's basically CurveCP, it will let you do things like migrate your clients (changing IP address) without re-establishing the secure session.
CurveCP is really awesome and worth learning. It is really the security model we've been looking for for years, for ZeroMQ.
The big difference between CurveZMQ and TLS is this: using TLS is complex.
One of the visions of NaCl and thus CurveCP and CurveZMQ in turn is that simple is more secure than complex. Users can't make as many mistakes.
CurveCP and CurveZMQ are simple. The current code for CurveZMQ is under 700 lines of C (assuming you have libsodium) and I didn't try to abstract any of the encryption calls; it's a flat implementation of the CurveCP handshake.
On another note, the comments about the flaws of the Salt model on http://www.zeromq.org/topics:pubsub-security do worry me, although they seem fixable. Have you or the Salt guys thought about that?
How would you have fared if you'd picked a simpler TLS library (PolarSSL, for example, is meant to be embedded) and then simply defined a single ZeroMQ configuration profile and said "that's it, that's all we're going to support"?
...and as many have noted, that configurability is the root of a lot of security problems.
The pick one approach and say, "that's all we're going to do" might be one way to solve the problem. I'm not sure it'd be any better.
With CurveCP you can still use TLS for key exchange itself; what CurveCP provides is a highly robust answer for the actual connection: short term keys and nonces. It's new but so is Salt's crypto algorithm, which was not built to quite the same level of paranoia as CurveCP.
We're still some time away from working code in libzmq and as much as a year or two from a crypto layer that's properly hardened. Having it in libzmq will mean it gets much more attention, which can only be good.
SSL was built and vetted by many parties over a long period of time and it was still broken. Anything other than an existing widespread protocol is folly.
:|