Generador de seeds para monedero IOTA (offline) - JS

Viendo que en el wallet de IOTA ya no está el “Seed generator” y que muchos que acaban de empezar tienen problemas para establecer una seed en su monedero, he hecho un pequeño y sencillo script en JS con el que generar seeds desde vuestro navegador offline.

Directrices:

Propuesta:

Tan sólo tenéis que acceder a cualquier navegador, buscar la consola de desarrolladores (suele estar en ajustes, menús de visualización u opciones de este tipo) y pegar el siguiente código. Es una función con un bucle que recorre las caracteres de un patrón de la A a la Z y el número 9 y los va juntando en un resultado final de forma “aleatoria”:

function cryptoRandom() {
    return window.crypto.getRandomValues(new Uint32Array(1))[0] / 0x100000000;
}

function generateSeed() {
	let seed = "";
	let pattern = "ABCDEFGHIJKLMNOPQRSTUVWXYZ9";

	for (var i = 0; i < 81; i++){
		seed += pattern.charAt(Math.floor(cryptoRandom() * pattern.length));
	}	

	return seed.toUpperCase();
}

console.log(generateSeed());

ENTER Y LISTO!

Ejemplo de resultado final:

En la parte inferior tras el console.log tenéis la semilla resultante

FAQ:

¿Por qué pongo aleatorio entre comillas?
Es complicado encontrar una función que genere números pseudoaleatorios criptográficamente seguros para que todo tenga una cierta aleatoriedad. Una de las opciones que he encontrado como alternativa a Math.random() es window.crypto.getRandomValues(), debería funcionar para la mayoría de navegadores…

Enlace para el que tenga interés en CSPRNG.

Avisos
No me hago responsable del uso que podáis darle al script, ni a la utilización de las seed resultantes o tokens almacenados en direcciones generadas a partir del script. Cada uno es responsable de lo que hace :wink:

Otras opciones:

  1. Python: Installed light wallet 2.3, no random seed generator in tools? - Beginners - IOTA Forum
  2. seedgen (no he encontrado el source)
  3. GitHub - knarz/seedgen: naive iota seed generator

Espero que os sea de utilidad, cualquier duda, mejora o problema que veáis sobre este pequeño script podéis dejarlo en una nueva respuesta.

12 me gusta

Gracias por tu aporte!
Me fue de utilidad.

2 me gusta

Ese método getRandomValues() ¿será suficientemente aleatorio? Creo que si se usa un PRNG la semilla debe ser aleatoria (por eso se suele partir de una serie de movimientos aleatorios del ratón para obtenerla) Después, a partir de esa semilla, se calcula la sucesión con el PRNG.

Vamos, que no soy especialista, lo digo por paranoia, porque hay que extremar las precauciones en una cosa como esta, a ver sí se van a generar un montón de wallet con semilla predecible, como le pasó una vez a Blockchain.info

Muevo este mensaje aquí porque el hilo puede servir como recopilatorio de generadores (no sé muy bien por qué lo quitaron del wallet)

En las FAQ de este hilo anda un poco explicado, un resumen sobre getRandomValues() puedes encontrarlo en

https://developer.mozilla.org/ca/docs/Web/API/RandomSource/getRandomValues

The RandomSource.getRandomValues() method lets you get cryptographically strong random values. The array given as the parameter is filled with random numbers (random in its cryptographic meaning).

To guarantee enough performance, implementations are not using a truly random number generator, but they are using a pseudo-random number generator seeded with a value with enough entropy. The PRNG used differs from one implementation to the other but is suitable for cryptographic usages. Implementations are also required to use a seed with enough entropy, like a system-level entropy source.

Estaría bien tener todavía más entropía, pero es una de las múltiples opciones que existen

1 me gusta

Y que tiene de malo aporrear el teclado hasta tener 81 caracteres? Yo las saco asi, moviendo las manos para que los dedos no esten cerca de las mismas teclas, no pulsando una vez con cada mano, usando las letras de los extremos… me cuesta creer que se pueda sacar un patron asi

1 me gusta

Es que si alguien observa tus manos, podría deducir como lo haces y aporreando el teclado como tú, sacaría la misma SEED… es un método claramente inseguro :stuck_out_tongue_winking_eye:

3 me gusta

Parece ser que en Chrome se utiliza una implementación del método que utiliza ARC-4, o sea RC-4, que es un algoritmo de encriptación roto.

O eso me parece entender, miradlo a ver, porque en ese caso las semillas podrían ser predecibles:

https://bugs.chromium.org/p/chromium/issues/detail?id=552749

1 me gusta

Hola, yo no tengo ni idea de programación, …estoy empezando con c++ .

Mi pregunta es si hay alguna forma de crear direcciones off line con tu semilla y que no sea muy complicado, es sobre todo para almacenar en frío.