# Chiffrement anonyme

En plus du SDK complet, Seald propose également un SDK de chiffrement anonyme. Celui-ci permet à votre application de fournir un moyen à des utilisateurs sans identité Seald (non-inscrits, ou non-connectés) de chiffrer des données pour un utilisateur avec une identité Seald. Vous pouvez également l'utiliser pour que votre serveur chiffre des données pour vos utilisateurs.

Par mesure de sécurité, afin d'éviter une utilisation abusive de vos quotas de chiffrement, votre serveur doit autoriser ces chiffrements anonymes à l'aide de JSON Web tokens.

# Import et instanciation

Le SDK de chiffrement anonyme de Seald s'importe de façon séparée du SDK complet.

Il y a trois manières d'utiliser le SDK Anonyme dans votre navigateur, selon vos besoin et l'architecture de votre application web.

# Bibliothèque

Ceci importe @seald-io/sdk-web/lib/anonymous-sdk.js, qui est la version empaquetée pour le web.

Utilisez cette méthode si vous utilisez un bundler comme Webpack. Pour cela, referez-vous à la section Empaquetage personnalisé et transpilation du guide sur les imports.

Cette méthode est recommandée, puisqu'elle permet de diminuer la duplication des dépendances et polyfills, et donc minimiser la taille finale de votre application.

# Bibliothèque polyfillée

Cette version est déjà empaquetée, transpilée et minifiée pour l'utilisation dans un navigateur web. Elle inclut toutes les bibliothèques, dépendances et polyfills nécessaires à son fonctionnement.

Utilisez cette méthode si vous utilisez un bundler comme webpack, mais que vous ne voulez pas configurer ce bundler pour inclure les polyfills nécessaires.

# Bundle

Copiez le fichier @seald-io/sdk-web/lib/anonymous-sdk.browser.js, puis importez-le via une balise <script> :

Cette version est déjà empaquetée, transpilée et minifiée pour l'utilisation dans un navigateur web. Elle inclut toutes les bibliothèques, dépendances et polyfills nécessaires à son fonctionnement.

Elle expose le constructeur du SDK Anonyme dans la variable globale window.AnonymousSDK.

# Node.js / Electron

import { AnonymousSDKBuilder } from '@seald-io/sdk'

const anonymousSDK = AnonymousSDKBuilder({})

Cela importe la version empaqueté pour les projets Node.js.

Elle peut être utilisée pour un serveur NodeJS, une application de bureau en Electron, des tests unitaires, etc.

Vous aurez besoin d'installer node-fetch séparément :

npm i -S node-fetch

# React-Native

# Installation

Le SDK Anonyme pour react-native a une "peer dependency" qui doit être installée séparément :

  • react-native-modpow

Vous pouvez l'installer avec la commande:

npm i -S react-native-modpow

# Bundle

Si vous ne configurez pas vous-même la transpilation de votre application, vous pouvez utiliser la version empaquetée, transpilée et minifiée du SDK Anonyme. Elle est utilisable telle quelle.

# Bibliothèque

Si votre application est elle-même transpilée, vous pouvez importer la librairie source. Cela vous permettra alors d'optimiser la taille de votre application.

Cette bibliothèque devra être transpilée pour être utilisée. Pour cela, referez-vous à la section Empaquetage personnalisé et transpilation du guide sur les imports.

# JSON Web Tokens

Par mesure de sécurité, afin d'éviter une utilisation abusive de vos quotas de chiffrement, votre serveur doit autoriser ces chiffrements anonymes à l'aide de JSON Web tokens.

# Création d'un JWTSharedSecret

Pour créer un JSON Web Token, il vous faut tout d'abord un JWTSharedSecret.

Vous pouvez créer, lister, et supprimer les JWTSharedSecrets, qui permettent de créer des JSON Web Tokens pour votre équipe, sur la DashboardAPI.

Afin de créer un JWTSharedSecret, vous pouvez faire un POST /dashboardapi/v2/jwtsharedsecret/, avec dans le corps de la requête :

{
  "permissions": Array<Permission>
}
Permissions

Chaque JWTSharedSecret possède des permissions, et il peut assigner tout ou partie des permissions qu'il possède à chacun des JSON Web Token qu'il crée.

Les Permission sont des nombres entiers. Les valeurs possibles sont les suivantes :

  • PERMISSION_ALL = -1 : toutes les permissions.
  • PERMISSION_ANONYMOUS_CREATE_MESSAGE = 0 : permet de créer des JSON Web Tokens pouvant créer des messages anonymement.
  • PERMISSION_ANONYMOUS_FIND_KEYS = 1 : permet de créer des JSON Web Tokens pouvant récupérer des clés de chiffrement des destinataires.
  • PERMISSION_ANONYMOUS_FIND_SIGCHAIN = 2 : permet de créer des JSON Web Tokens pouvant récupérer la SigChain des destinataires. Non-utilisé.

Une fois le JWTSharedSecret créé, vous devrez récupérer ce JWTSharedSecret et son JWTSharedSecretId pour permettre à votre serveur de créer des JSON Web Tokens.

TIP

JWTSharedSecret est, comme son nom l'indique, secret. Veuillez prendre toutes les précautions nécessaires pour le stocker de manière sécurisée.

Au contraire, JWTSharedSecretId n'est lui pas secret.

Exemple de requête pour créer un JWTSharedSecret :

curl -X POST https://dashboard.seald.io/dashboardapi/v2/jwtsharedsecret/ \
  -H 'X-DASHBOARD-API-KEY: VOTRE_JETON_D_ACCES' \
  -H 'Content-Type: application/json' \
  --data-raw '{"permissions": [1]}'

Exemple de retour :

{
  "id": "32266d8c-2085-490a-8ef5-259ea35e1501", // UUID : JWTSharedSecretId
  "created": "2021-11-09T10:49:09.490338Z", // Timestamp ISO
  "shared_secret": "c9kijQo1kJgieXZ9TAHFj9R0TgHb4bgLhDnWWRgjq4TmBzUdSB5mzuOcBb0gQMSi", // String : JWTSharedSecret
  "permissions": [ 1 ] // Array<Permission>
}

# Création d'un JSON Web Token

Le chiffrement anonyme s'effectue en deux étapes 

  • récupération des clés de chiffrement des destinataires
  • création du message pour ces destinataires

Chacune de ces deux étapes doit être autorisée par un JSON Web Token.

Le JSON Web Token, ou JWT, est créé avec le JWTSharedSecret et son JWTSharedSecretId : il a comme iss le JWTSharedSecretId, et est signé avec le JWTSharedSecret avec l'algorithme HS256.

Ses données sont :

Nom Type Description
iss string "Issuer" : le JWTSharedSecretId
iat? number "Issued at" : horodatage du moment de création du JWT. Optionnel. Si défini, le JWT expire au bout de 10 min après création. Sinon, il n'expire pas.
jti? number "JWT ID" : nonce unique. Ne doit jamais être réutilisé. Optionnel. Si défini, ce JWT n'est utilisable qu'une seule fois. Sinon, il est utilisable jusqu'à son expiration éventuelle.
scopes? Array<Permission> Liste des permissions de ce JWT. Optionnel. Doit être un sous-ensemble des permissions du JWTSharedSecret. Si défini, ce JWT est limité à ces permissions uniquement. Sinon, il possède toutes les permissions du JWTSharedSecret créateur.
recipients Array<string> Liste des sealdIds des destinataires pour qui ce JWT est autorisé à effectuer des opérations.
owner? string Optionnel pour la récupération de clés de destinataires. Nécessaire pour la création de message. sealdId de l'utilisateur qui sera propriétaire des messages créés.

TIP

La récupération de clés de destinataires peut nécessiter plusieurs requêtes. Il est donc fortement déconseillé de définir un jti sur le JWT en question, sinon les requêtes après la première pourraient échouer. Il est par contre recommandé de définir un iat pour limiter dans le temps l'utilisation du JWT en question.

Au contraire, la création de message se fait en une seule requête. Il est donc recommandé de définir à la fois un iat, pour limiter dans le temps l'utilisation du JWT, et un jti, pour éviter que le même JWT soit utilisé plusieurs fois pendant l'intervalle de temps autorisé.

Exemple de création d'un JWT en Python :

Exemple de création d'un JWT en Node.JS :

TIP

Même si techniquement rien n'empêche d'utiliser un seul JWT pour les deux opérations, il est recommandé de créer deux JWT différents pour la récupération de clés et pour la création de message, afin de pouvoir définir un jti sur le JWT de création de message, pour que celui-ci ne puisse être utilisé qu'une seule fois.

# Utilisation

Vous avez maintenant tout le nécessaire pour faire un chiffrement anonyme. Cela se fait avec la fonction anonymousSDK.encrypt.

Les arguments à noter de cette fonction sont:

  • clearFile : Obligatoire. Le fichier à chiffrer. Peut être un string, un Buffer, un Blob, un WebStream ReadableStream, ou un stream Node Readable. Si vous utiliser un ReadableStream ou un Readable, vous devrez également donner l'argument fileSize.
  • getKeysToken : Facultatif. Le JWT utilisé pour la récupération de clé. Si il n'est pas fourni, la récupération de clé utilisera encryptionToken.
  • encryptionToken : Obligatoire. Le JWT utilisé pour la création de message.
  • sealdIds : Obligatoire. Tableau des Seald IDs des destinataires du message à créer.

Le retour de cette fonction est une Promise, contenant :

  • id : un string, ID du message nouvellement créé.
  • encryptedFile : fichier nouvellement chiffré, au même format que le format du clearFile donné.

Exemple d'utilisation :