Comment utiliser les clefs d'un Wallet dans IPFS?

IPFS comporte un mécanisme de publication qui permet de pointer vers une structure de donnée qui est mise à jour (IPNS).

ipfs name publish --key=mykey /ipfs/Qm...
Published to Qm_Pointeur_IPNS: /ipfs/Qm...

La clef “mykey” (stockée dans ~/.ipfs/keystore/) est issue de http://docs.ipfs.io/reference/api/cli/#ipfs-key-gen dont l’ago est ed25519

Il s’agit du même algorithme utilisé dans Duniter!? Alors je me demande si je pourrai utiliser les clef d’un wallet à la place de mykey et/ou inversement.

Voici à quoi ressemble mykey (IPFS)

~ $ ipfs key gen -t ed25519 mykey
12D3KooWBgYmCrh5fyyueyUULWJM1gxsUbkY7JKsv814Z4NamKdS

~ $ cat .ipfs/keystore/mykey | base58
23jhTc5ajfnx7oYteSWHus6zyhWJq2zUceK8EXEsaG8HDHx1oAY4VHVJo2eniU9aejXVnm1maVNm3Af2ZAfw1WJ3eb2XA

Et voici celle produite par silkaj

~ $ silkaj generate_auth_file
Please enter your Scrypt Salt (Secret identifier): 
Please enter your Scrypt password (masked): 
Using default values. Scrypt parameters not specified or wrong format
Scrypt parameters used: N: 4096, r: 16, p: 1
Authentication file 'authfile' generated and stored in current folder for following public key: CDFKnaLHN32oyVFgWPiagztsXMqB4D6mRFY2TZk4e5JS

~ $ cat authfile 
ce1e811b02e297436596a3a33783817c4198a60fac7383b1e0f96f9898081490

Le authfile de silkaj semble encodé en HEX.
Ce qui donne en base58 EsbxubvihwtuL4FgGJjiqr6YQN23aD44U5FDSWNqmETR (http://lenschulwitz.com/base58) mais n’a pas la même taille que mykey (que je peux changer avec l’option -s )

Où pourrai-je trouver de la documentation sur la méthode de génération de clef de Duniter?
Pensez-vous qu’il est possible d’établir un lien de cohérence cryptographique entre les 2 systèmes?
Si oui, quelle piste devrai-je suivre?

3 Likes

La doc de @Tortue sur la génération des clefs :

https://tmp.tednet.fr/paperwallet/AddressFormat.html

Je ne sais pas si ça répond à ton besoin.

Sur le lien Duniter /IPFS, je n’ai aucun élément.

1 Like

@Frederic_Renault Les implémentations d’ed25519 utilisés dans l’écosystème Duniter/G1 fournissent des trousseaux de clé de taille fixe :

  • 64 octets pour la clé privée
  • 32 octets pour la clé publique

Cela est possible car c’est un hash sha512 de la seed qui est utilisé, d’où la taille fixe quelque soit la taille de la seed.

Le fait d’utiliser un salt+password ne fait pas parti du protocole de Duniter, c’est une pratique je n’ai jamais compris et que je ne comprend toujours pas, la plupart des cryptos utilisant une seed unique.
Bref, tu génère ton trousseau de clés ed25519 comme tu veut, tant que ta clé publique a bien une taille de 32 octets ça fonctionnera dans Duniter et Durs (et aussi dans Juniter je suppose).

Pour te connecter a Cesium il te suffit de créer un fichier .dunikey respectant le format suivant :

pub: clepublique
sec: cleprivee

Les 2 clés au format base58.

Pour t’aider a manipuler tout ça tu a le formidable outil dunikey codé par @1000i100: https://gsper.duniter.io/dunikey.html

Graçe a dunikey tu pourra notamment vérifier si une meme seed te donne le même trousseau de clés via IPFS et via l’écosystème Duniter/G1.
Par contre, il semble en zieutant la doc d’ipfs qu’ils n’est pas prévus la possibilité de renseigner soit même la seed souhaitée, j’ai l’impression que ça se limite a la génération aléatoire d’un trousseau, si c’est avéré c’est très limitant…

Concernant le fichier mykey généré par IPFS 2 possibilités :

  • il est probable qu’il s’agisse d’une concaténation des clés publiques et privées l’une a la suite de l’autre en binaire suivi d’une conversion en base58.
  • il également possible qu’il s’agisse de la clé privée seule (la clé publique pouvant être retrouvée par calculs).

Cependant vu la taille importante je penche davantage pour la 1ère possibilité :wink:

Bonnes investigations :slight_smile:

3 Likes

Tu dis ça sérieusement ?

2 Likes

OK. Merci pour toutes ces explications!
Je crois que j’ai pigé…

Et sinon, on a rien en ligne de commande comme “ipfs gen key”?

Oui dsl j’ai écris ça vite j’avoue que ça peut faire provocateur mais ce n’est pas le but :sweat_smile:

Oui sérieusement j’ai toujours trouvé que devoir gérer 2 pass ça complique la vie aux utilisateurs et je ne suis pas convaincu que ça apporte plus de sécurité :thinking:
Je ne suis d’ailleurs pas le seul a penser ça, ceux qui ont l’habitude des autres cryptos comme @nanocryk ou @Looarn ont probablement un avis similaire.
Une seule passphrase a retenir c’est bien plus simple et tout aussi safe :slight_smile:

avec plaisir :slight_smile:

Que veut tu dire exactement ?
Comme tu l’a montré silkaj permet déjà de générer un trousseau en ligne de commande.
Duniter te le permet également avec la commande wizard key :wink:

1 Like

je sais pas comment envoyer ca dans dans “ipfs gen key --type=ed25519 [chaineUnique]” mais voilà une piste

public static byte[] computeSeedFromSaltAndPassword(String salt, String password) {
	try {
		final byte[] seed = SCrypt.scrypt(Crypto.decodeAscii(password), Crypto.decodeAscii(salt),
				SCRYPT_PARAMS_N, SCRYPT_PARAMS_r, SCRYPT_PARAMS_p, SEED_LENGTH);
		return seed;
	} catch (final GeneralSecurityException e) {
		throw new TechnicalException("Unable to salt password, using Scrypt library", e);
	}
}

Enter the secret box

si le problème c’est comment générer la clef avec une seul chaîne … voila comment le salt and password sont combiné chez moi. c’est le code des pods césium donc mieux vaut demander a benoît le détails

Ah oui, par rapport à une passephrase, je comprends. Je croyais que tu pensais plutôt au trousseau physique aléatoire qu’il faut stocker et surtout ne pas perdre.

Mais en effet la mono-passphrase suffit. J’ai proposé l’usage de la double passphrase uniquement à cause de scrypt, mais au final non seulement scrypt n’est pas nécessaire mais en plus, au pire, la passphrase peut peut être splittée en deux pour y satisfaire.

Mais comme tu dis, scrypt ne fait pas partie du protocole. Duniter, Cesium, Silkaj et autres peuvent déjà passer à la simple passphrase.

4 Likes

Pour rebondir, j’utilise dans ma librairie PHP directement les seeds plutôt que pass+salt.
ça m’évite en fait de gérer scrypt dans PHP. #flemme. :smiley:

Mais vu que c’est l’usage, je pense que pour un plugin e-commerce, il faudra y passer un jour. ^^

2 Likes

c quoi scrypt ?

utilisation de ed25519 avec ipfs-js