Does anyone know of a standardized serialization format which can be (or already is) widely used for encrypted messages? For a variety of reasons (mostly complexity, age and poor support across a lot of languages) we don't want to use OpenPGP for this case.
The use case is fairly simple, we want to create "stateless" (from the server's perspective) authorization token across a wide variety of our web-based applications, without having to implement an OAUTH-handshake as users transition from application to application. The applications are written in a variety of languages, some .NET, some Java, some Node.js, and Python.
It seems a reasonable, modern solution to this problem is to use libsodium
's crypto_secretbox_easy
to authenticate a user and then encrypt a message of the form:
{identity: '[email protected]', expires: '2015-02-27T09:45:35.886Z'}
...and send it to the client for cookie storage. Assuming secure configuration of keys in all the various applications, we could use the libsodium
variants for each platform to authenticate a user based on this encrypted and authenticated token.
The problem, of course, is how to format the message? I need to transmit the nonce as well, but that isn't part of the output of crypto_secretbox_easy
, and nothing I've found during research seems to indicate there is a standard serialized message format for use with libsodium
. Lots of people are rolling their own.
So, is it safe to use a general cross-platform message serialization library such as MessagePack to transmit a message of the form:
{nonce_value: 0x44ec53c1235daa22d3e0322931ce2d2c47ece2a5ae46a00e,
secretbox_message: 0xa3ce9f0edb35a058eaf90d87f871ecdf6fb7f88ec547f377fdb27780716e1904ab8663dbce724d1bfcc7ee1f40108400}
I know enough about crypto to know "there be dragons" when inventing your own protocols, and assembling crypto primitives naively has repeatedly shown to be disaster. So if there is a standardized and secure way of doing this sort of encrypted and authenticated messaging (other than OpenPGP) I would of course like to use that. If there isn't a modern standard for this task, I ask:
- do you think my proposed construction is secure?
- are there any reasons that general structured serialization libraries are unsuitable for use in cryptographic protocols? Looking at various PGP, TLS, and PKCS specifications, it seems this wheel gets re-invented quite a lot, and I don't quite understand why.