perlmojolicious

Mojolicious weird cookies


I am playing around with Mojolicious and see session cookies have strang look:

mojolicious=eyJleHBpcmVzIjoxNjY3MDUyNTEzLCJ1c2VyIjoic2ViYXN0aWFuIn1aWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlo---8ec2dbb1e9eeb295f610826487a011f3516106cb8a814530e73212a1e6a10d8f

Do you know what these "WlpaWlpaWlpaWlpaWlpaWlpa..." mean? I see the signature is ok, data is ok, but WlpaWlpaWlpaWlpaWlpaWlpa... In base64 this is ZZZZZZ... Where they have come from? I have only this code to set up session:

$self->session(user => 'sebastian');

I am playing with it on the clean project. Protocol: HTTP (no SSL)

Mojolicious 9.28.


Solution

  • This behaviour was added to Mojolicious in Pull Request #1791. The padding is intended to make it more difficult to brute-force the application secret that's used to sign secure cookies such as the session cookie. The choice of the padding character Z and the length of the padding seems arbitrarily chosen.

    I think that this padding is almost entirely pointless as a security measure. As it is added in a deterministic manner it cannot make brute force attacks more difficult. As implemented, it's not even helpful to include the padding in the cookie, since the HMAC signature calculation can re-add the padding when necessary. In contrast, padding from a CSPRNG, without reusing padding patterns during the application's lifetime, would probably achieve the desired effect. Compare the concept of a salt for password hashes.

    That you stumbled over this undocumented behaviour indicates a number of aspects:

    If you want to secure your application secret against brute force attacks, it's important to create a strong cryptographically secure secret of suitable length (at the very least 128 bits of entropy). Ideally, your application would also regularly rotate secrets. Mojolicious supports having multiple active secrets, so that adding a new secret will not invalidate existing sessions.