WSSE en JavaScript (NodeJS)

Publié le par samuel

La mise en place d’une sécurité WSSE en symfony2 est assez simple en suivant le cookbook mise à disposition par sensioLabs.

Une fois cette sécurité mise en place en PHP, il faut le transcrire dans différents langages de programmation pour diverse application tierces.

Aujourd’hui le langage est Javascript avec NodeJS.

Pour le WSSE il faut :

  • Une date au format DATE_ATOM
  • Base64 encode et decode
  • Un générateur de clé aléatoire
  • Une fonction de Hachage SHA-1

DATA_ATOM

Après beaucoup de recherche sur le format DATE_ATOM en Javascript. Je n’est rien trouvé en natif. Donc voici un exemple de code le permettant :

var now = new Date();
var offset = (now.getTimezoneOffset() ? '+' : '-') +
    ("0" + Math.abs(now.getTimezoneOffset() / 60)).slice(-2) + ":" +
    ("0" + now.getTimezoneOffset() % 60).slice(-2);
var strDate = now.getFullYear() + '-' +
    ("0" + (now.getMonth()+1)).slice(-2) + '-' +
    ("0" + (now.getDate())).slice(-2) + 'T' +
    ("0" + (now.getHours())).slice(-2) + ':' +
    ("0" + (now.getMinutes())).slice(-2) + ':' +
    ("0" + (now.getSeconds())).slice(-2) + offset;

Base64

Le Base64 est plus simple avec la librairie Buffer de NodeJS.
Encode :

var b = new Buffer('JavaScript');
var s = b.toString('base64');

Decode :

var b = new Buffer('SmF2YVNjcmlwdA==', 'base64')
var s = b.toString();

Générateur de clé aléatoire (Nonce)

Le plus simple est de coupler un random et un MD5 :

Le random

var rand = Math.random();

Le MD5 via la librairie -> https://www.npmjs.com/package/md5

var md5 = require('md5');
var nonce = md5("un test");

Fonction de Hachage SHA-1

SHA-1 via la librairie -> https://www.npmjs.com/package/sha1

var sha1 = require('sha1');
var digest = sha1("un test");

Exemple complet

var sha1 = require('sha1');
var md5 = require('md5');

var now = new Date();
var offset = (now.getTimezoneOffset() ? '+' : '-') +
    ("0" + Math.abs(now.getTimezoneOffset() / 60)).slice(-2) + ":" +
    ("0" + now.getTimezoneOffset() % 60).slice(-2);
var strDate = now.getFullYear() + '-' +
    ("0" + (now.getMonth()+1)).slice(-2) + '-' +
    ("0" + (now.getDate())).slice(-2) + 'T' +
    ("0" + (now.getHours())).slice(-2) + ':' +
    ("0" + (now.getMinutes())).slice(-2) + ':' +
    ("0" + (now.getSeconds())).slice(-2) + offset;
var nonce = md5(Math.random());
// attention exemple correspond en php a -> "base64_encode(sha1($nonce.$created.$secret))"
var digest = new Buffer(sha1(nonce + strDate + 'MyPassword')).toString('base64');
var wsse = 'UsernamToken Username="MyUserName", PasswordDigest="' + digest + '", Nonce="' + nonce + '", Created="' + strDate + '"'
Cette entrée a été publiée dans Symfony 2 API, Symfony 2 Utils, avec comme mot(s)-clef(s) , , , . Vous pouvez la mettre en favoris avec ce permalien.



Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*


nine - = 6

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>