SymEncKeys
Le concept des SymEncKeys
est une fonctionnalité du SDK Seald qui permet de récupérer une EncryptionSession
sans en être destinataire directement.
L'idée est de transmettre un secret (sous la forme d'un password
, ou d'une paire rawSecret
/rawSymKey
) au destinataire, ainsi que l'ID de la SymEncKey
, qui lui permettront de récupérer la EncryptionSession
.
Les SymEncKeys
fonctionnent de la manière suivante :
- Le créateur d'une session lui rajoute une
SymEncKey
avec la méthodesession.addSymEncKey()
, avec un secret. Cela lui retourne l'ID de laSymEncKey
ainsi créée. - Le secret est transmis hors-bande à la personne devant déchiffrer (par exemple, via un QRCode). Cette personne peut ensuite utiliser
sdk.retrieveEncryptionSessionWithSymEncKey()
ouanonymousSdk.retrieveEncryptionSession()
pour récupérer la session et déchiffrer.
La manière dont ce secret est transmis du créateur au destinataire est de votre ressort, et dépend de votre cas d'usage.
WARNING
Cette fonctionnalité n'est pour l'instant présente que dans le Seald SDK pour JavaScript, et n'est pas encore implémentée dans le SDK Seald Mobile pour Android, iOS, et Flutter.
Création d'une SymEncKey
L'utilisateur qui a créé une EncryptionSession
, ou tout utilisateur y ayant accès et qui a le droit forward
, peut créer une SymEncKey
pour cette EncryptionSession
.
Pour créer une SymEncKey
, il faut récupérer l'objet EncryptionSession
, et utiliser la méthode session.addSymEncKey()
. Cette méthode prend comme arguments :
- ou un
password
; - ou une paire
rawSecret
etrawSymKey
.
Utiliser un password
est plus simple, car il n'y a alors que cette valeur à transmettre au destinataire, mais plus lent, car le SDK dérive ce password
en rawSecret
et rawSymKey
, ce qui peut prendre quelques centaines de millisecondes.
TIP
Afin d'assurer la confidentialité end-to-end, rawSecret
et rawSymKey
(ou password
, qui permet de les dériver) doivent rester secrets, même de votre serveur.
rawSecret
permet de prouver au serveur Seald qu'on est en droit de récupérer la clé de session chiffrée, et rawSymKey
est la clé qui permet de déchiffrer la clé de session.
Vous pouvez également spécifier des droits pour les utilisateurs de cette SymEncKey
avec l'argument rights
.
TIP
Les rights
par défaut pour une SymEncKey
sont { read: true, forward: true, revoke: false }
.
- le droit de
read
est nécessaire, sinon laSymEncKey
est inutilisable ; - le droit de
forward
permet d'utilisersdk.selfAddToEncryptionSessionWithSymEncKey
pour s'ajouter en tant que destinataire normal d'uneEncryptionSession
via uneSymEncKey
; - le droit de
revoke
sur uneSymEncKey
permet, lors de l'utilisation desdk.selfAddToEncryptionSessionWithSymEncKey
, de se donner le droit derevoke
sur cette session.
La méthode session.addSymEncKey()
rend un string
, qui est l'ID de la SymEncKey
créée. Cet ID n'est pas secret, et peut être transmis à votre serveur.
Exemple d'utilisation :
const crypto = require('node:crypto')
// `rawSecret` peut être un string arbitraire, tant que celui-ci est suffisamment difficile à deviner. Ici, nous utilisons `crypto` par simplicité. Un UUIDv4 serait également un bon choix.
const rawSecret = crypto.randomBytes(64).toString('base64')
// `rawSymKey` doit nécessairement être un buffer de 64 octets aléatoires cryptographiquement sécurisé, encodé en base64.
const rawSymKey = crypto.randomBytes(64).toString('base64')
// Création de la `SymEncKey`
const symEncKeyId = await session.addSymEncKey({
rawSecret,
rawSymKey,
rights: { read: true, forward: false, revoke: false }
})
Récupération d'une session avec une SymEncKey
Pour récupérer une EncryptionSession
via une SymEncKey
, il faut utiliser la méthode sdk.retrieveEncryptionSessionWithSymEncKey()
. Cette méthode prend comme arguments :
- l'ID de la session ;
- l'ID de la
SymEncKey
, qui n'est pas secret et peut être transmis via votre serveur ; - le secret de la
SymEncKey
(sous forme ou d'unpassword
, ou d'une pairerawSecret
/rawSymKey
).
TIP
Afin d'assurer la confidentialité end-to-end, le secret de la SymEncKey
(sous forme de password
, ou de paire rawSecret
/rawSymKey
) doit rester secret, même de votre serveur.
La manière dont ce secret est transmis du créateur au destinataire et de votre ressort, et dépend de votre cas d'usage.
La méthode sdk.retrieveEncryptionSessionWithSymEncKey()
rend une EncryptionSession
, qui permet ensuite de chiffrer/déchiffrer des messages et fichiers.
TIP
Si vous accédez à une EncryptionSession
via une SymEncKey
, vous ne pouvez pas utiliser les méthodes de gestions d'accès de celle-ci (session.addRecipients()
, session.addSymEncKey()
, session.revokeRecipients()
, session.listRecipients()
, ...).
Exemple d'utilisation :
// Récupération d'une session avec une `SymEncKey`
const session = await sdk.retrieveEncryptionSessionWithSymEncKey({
sessionId, // `sessionId` n'est pas secret, et peut être transmis via votre serveur
symEncKeyId, // `symEncKeyId` n'est pas secret, et peut être transmis via votre serveur
symEncKeyRawSecret, // `symEncKeyRawSecret` est secret, et ne doit jamais être connu de votre serveur
symEncKeyRawSymKey // `symEncKeyRawSymKey` est secret, et ne doit jamais être connu de votre serveur
})
Auto-ajout à une session avec une SymEncKey
Si vous avez accès à une EncryptionSession
via une SymEncKey
, et que cette SymEncKey
a le droit forward
, vous pouvez également l'utiliser pour vous ajouter comme destinataire "normal" de cette session. Cela vous permet par exemple de transférer ensuite cette session à d'autres utilisateurs, ou à un groupe. Pour cela, vous pouvez utiliser la méthode sdk.selfAddToEncryptionSessionWithSymEncKey()
. Cette méthode prend comme arguments :
- l'ID de la session ;
- l'ID de la
SymEncKey
, qui n'est pas secret et peut être transmis via votre serveur ; - le secret de la
SymEncKey
(sous forme ou d'unpassword
, ou d'une pairerawSecret
/rawSymKey
).
Vous pouvez également spécifier des droits pour vous-même en tant que destinataire de cette session, dans la limite des droits de la SymEncKey
, avec l'argument rights
.
TIP
Les rights
par défaut pour vous-même sont { read: true, forward: true, revoke: false }
.
- le droit de
read
est nécessaire ; - le droit de
forward
vous permet de transférer cette session à d'autres destinataires viasession.addRecipients()
et de créer de nouvellesSymEncKeys
; - le droit de
revoke
vous permet de révoquer des destinataires de cette session et d'en supprimer desSymEncKeys
.
Par commodité d'usage, la méthode sdk.selfAddToEncryptionSessionWithSymEncKey()
rend aussi l'EncryptionSession
.
Exemple d'utilisation :
// Auto-ajout à une session avec une `SymEncKey`
const session = await sdk.selfAddToEncryptionSessionWithSymEncKey({
sessionId, // `sessionId` n'est pas secret, et peut être transmis via votre serveur
symEncKeyId, // `symEncKeyId` n'est pas secret, et peut être transmis via votre serveur
symEncKeyRawSecret, // `symEncKeyRawSecret` est secret, et ne doit jamais être connu de votre serveur
symEncKeyRawSymKey, // `symEncKeyRawSymKey` est secret, et ne doit jamais être connu de votre serveur
rights: { read: true, forward: false, revoke: false }
})
Récupération anonyme d'une session avec une SymEncKey
Pour récupérer anonymement une EncryptionSession
via une SymEncKey
, il faut utiliser la méthode anonymousSdk.retrieveEncryptionSession()
. Cette méthode prend comme arguments :
- l'ID de la session ;
- l'ID de la
SymEncKey
, qui n'est pas secret et peut être transmis via votre serveur ; - le secret de la
SymEncKey
(sous forme ou d'unpassword
etappId
, ou d'une pairerawSecret
/rawSymKey
) ; - un JWT
retrieveSessionToken
, créé par votre serveur, qui autorise la récupération de la session.
TIP
Afin d'assurer la confidentialité end-to-end, le secret de la SymEncKey
(sous forme de password
, ou de paire rawSecret
/rawSymKey
) doit rester secret, même de votre serveur.
La manière dont ce secret est transmis du créateur au destinataire et de votre ressort, et dépend de votre cas d'usage.
La méthode anonymousSdk.retrieveEncryptionSession()
rend une AnonymousEncryptionSession
, qui permet ensuite de chiffrer/déchiffrer des messages et fichiers.
Exemple d'utilisation :
// Récupération anonyme d'une session avec une `SymEncKey`
const session = await anonymousSdk.retrieveEncryptionSession({
sessionId, // `sessionId` n'est pas secret, et peut être transmis via votre serveur
symEncKeyId, // `symEncKeyId` n'est pas secret, et peut être transmis via votre serveur
symEncKeyRawSecret, // `symEncKeyRawSecret` est secret, et ne doit jamais être connu de votre serveur
symEncKeyRawSymKey, // `symEncKeyRawSymKey` est secret, et ne doit jamais être connu de votre serveur
retrieveSessionToken // JWT généré par votre serveur pour autoriser cette récupération anonyme
})