Clés et identités
Dans Secrecy, les clés n'appartiennent pas directement aux utilisateurs : elles appartiennent à des identités. Une identité est tout ce qui détient une paire de clés et peut recevoir l'accès à des données : une clé publique, que n'importe qui peut utiliser pour verrouiller quelque chose à son intention, et une clé privée, seul moyen de le déverrouiller. Il existe deux sortes d'identités, et une clé au-dessus de toutes, la clé maître, qui protège leurs clés privées.
Chaque niveau verrouille celui du dessous : la clé maître verrouille les clés d'identité, et les clés d'identité verrouillent les clés de donnée qui chiffrent les données elles-mêmes.
La clé maître
Chaque compte Secrecy possède une clé maître. Elle est dérivée du mot de passe de l'utilisateur, sur la page de connexion Secrecy, à chaque connexion. Elle n'est jamais stockée ni envoyée nulle part : les serveurs ne conservent qu'un sel aléatoire qui entre dans la dérivation.
La clé maître n'a qu'un rôle : verrouiller les clés privées des identités de l'utilisateur. Elle ne chiffre jamais de données directement, et ne quitte jamais la page de connexion : votre application ne la voit jamais, même après la connexion.
Les utilisateurs peuvent exporter leur clé maître depuis leur compte Secrecy sous forme de phrase de récupération, pour garder leurs clés accessibles s'ils perdent leur mot de passe.
Votre identité dans une application
Un utilisateur reçoit une identité par application, créée la première fois qu'il s'y connecte. Elle a sa propre paire de clés :
- la clé publique est celle pour laquelle les autres utilisateurs verrouillent des données, quand ils partagent avec lui dans votre application ;
- la clé privée est stockée par Secrecy verrouillée par la clé maître. Seule la page de connexion peut la déverrouiller, et elle remet la clé déverrouillée à votre application à la connexion.
Comme chaque application a sa propre identité, une même personne a une clé publique différente dans chaque application. Une donnée partagée avec elle dans une application ne s'ouvre pas dans une autre. C'est pourquoi secrecyClient.publicKey et secrecyClient.app.userPublicKey renvoient toujours la clé d'un utilisateur dans l'application en cours.
Les identités de groupe
Un groupe est une identité à part entière, avec sa propre paire de clés, partagée par ses membres. Les groupes appartiennent à une application.
- Rejoindre un groupe, c'est recevoir sa clé. Quand un membre est ajouté, le SDK verrouille la clé privée du groupe pour l'identité de ce membre. À la connexion, le membre la déverrouille avec sa propre clé privée, en même temps que son identité d'application. Un groupe peut lui-même être membre d'un autre groupe.
- Quitter un groupe, c'est perdre cette copie. Retirer un membre supprime sa copie verrouillée de la clé du groupe.
- Partager avec un groupe atteint tous ses membres. La donnée est verrouillée une seule fois, pour la clé publique du groupe, et chaque membre peut l'ouvrir grâce à la clé du groupe.
- Rôles. Un groupe a un propriétaire, et ses membres sont soit administrateurs, soit simples membres.
Par défaut, un client agit en tant qu'identité d'application de l'utilisateur. Définir secrecyClient.currentGroup le fait agir en tant que l'un des groupes de l'utilisateur : ce qu'il crée et partage ensuite est chiffré avec les clés du groupe.
Ce que Secrecy stocke
Pour que tout cela fonctionne d'un appareil à l'autre, Secrecy stocke, pour chaque identité, sa clé publique et sa clé privée, verrouillée. Il stocke aussi le sel de chaque clé maître. Il ne stocke jamais la clé maître, ni aucune clé privée sous une forme lisible : ce qu'il détient suffit à acheminer les clés vers les bons appareils, jamais à les ouvrir. Voir zero-knowledge.