2017-10-16 7 views
0

Nous avons construit un module javascript qui peut être intégré dans des pages Web tierces. Lorsque ce module client est initialisé, il exécute une transaction au sein de notre application Web via une requête intersite.Longueur de la clé privée HMAC sha256 digest donnée donnée

La transaction consiste en un uuid externe, un e-mail et quelques propriétés méta supplémentaires. Ce message est signé avec un condensé HMAC sha256, en utilisant la clé API privée de notre partenaire.

exemple Ruby:

data = { 
    uuid: "ABCAFAFDS", 
    email: "[email protected]", 
    meta: {} 
} 

private_key = "Qd9fe0y2ezqfae4Qj6At" 
signature = OpenSSL::HMAC.hexdigest(
    OpenSSL::Digest.new("sha256"), 
    private_key, 
    data.to_json 
) 

la page web tiers, le client javascript est alors initialisé avec la signature et les données:

new Client(signature, data).execute(); Initialement, notre plan était de permettre au client de créer une transaction partielle/incomplète au sein de notre système, puis de demander une demande dorsale ultérieure via notre API REST pour confirmer/finaliser la transaction. En supposant que nous puissions sécuriser le frontal, il serait préférable de supprimer l'exigence de confirmation dorsale. Pouvons-nous raisonnablement sécuriser le code client en utilisant des messages signés de cette manière? Si les données et le message signé sont disponibles dans le client, est-il difficile pour un mauvais acteur de forcer la longueur de la clé privée de l'API, étant donné la longueur ci-dessus?

+0

Probablement mieux adapté pour http://security.stackexchange.com – deceze

Répondre

1

la plupart du trafic Internet a signé des jetons sur le client ces jours-ci. Toutes vos connexions Gmail, les connexions Facebook, etc font cela donc c'est assez standard. Je vous recommande d'utiliser une norme existante (et une bibliothèque tierce) plutôt que de lancer votre propre jeton. Cela vous permettra de tirer parti de l'expertise des autres dans ce domaine. JWT (json web token) est couramment utilisé et il existe de nombreuses bibliothèques pour travailler avec JWT. Voir https://jwt.io pour plus d'informations.

+0

Merci Brandon, en utilisant JWT par rapport à rouler notre propre mise en œuvre est un excellent point. Encore une question, cependant. Dans les tutoriels JWT, le jeton est généré sur le back-end et envoyé au client. Le client ne voit pas la charge utile ou les en-têtes non signés. Avec notre module, les informations utiles sont visibles dans l'interface utilisateur (uuid, e-mail, les méta-propriétés, etc.) puisque nous affichons visuellement ces propriétés. Est-ce que cela brise la sécurité du protocole? Est-ce qu'il est plus facile pour les pirates de deviner la clé privée, étant donné leur connaissance de la charge utile et des en-têtes? – Ben

+0

Non, c'est essentiellement la même chose - les jetons jwt sont juste signés, pas cryptés. Ils semblent obfusqués uniquement parce que le jeton est codé en base64. Vous pouvez utiliser des bibliothèques jwt clientes pour décoder un jeton et obtenir le contenu à des fins d'affichage. Notez que les jetons jwt supportent plusieurs algorithmes de signature - il existe des algorithmes symétriques et asymétriques, ce qui signifie que vous pouvez même utiliser un algorithme asymétrique qui permettra à n'importe qui (même le client) d'utiliser la clé publique pour vérifier l'authenticité du jeton sans avoir accès au Clé privée. – Brandon

+0

Et, évidemment, puisque les jetons ne sont pas cryptés, ne mettez aucune donnée dans le jeton qui devrait être gardée secrète du client – Brandon