¿Cómo validar una clave privada?

No pude encontrar ninguna biblioteca que, dado un valor hexadecimal, devuelva verdadero si la cadena dada es una clave privada de éter válida.

¿Alguna pista?

Respuestas (3)

Como mencionó Peter, una clave privada es un blob aleatorio de 256 bits. Es un descuido común que no hay restricciones.

Tiene que ser válido para la curva secp256k1, lo que significa dos condiciones:

  • no puede ser cero
  • debe ser menor que el orden de la curva (llamada ny tiene un valor de ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141)

En Javascript, puede usar ethereumjs-wallet para realizar esta verificación: Wallet.fromPrivateKey(<yourkey>)generará una excepción en una entrada no válida.

Alternativamente, también puede usar el privateKeyVerify()método de la biblioteca subyacente secp256k1o hacerlo manualmente con la biblioteca de números grandes de su elección.

importante : esta respuesta se refiere a la dirección pública, no a la clave privada, vea los comentarios.

Cada cadena hexadecimal es una dirección válida de Ethereum.

Actualmente no hay sumas de verificación de direcciones implementadas, por lo que todas 0x<40 hex digits here>son válidas. Estamos considerando agregar ICAP básico en Geth 1.4.1 o Geth 1.5 para permitir la inserción de información adicional en una dirección que evitaría escribirlos mal, pero hasta entonces, mientras sean 40 caracteres hexadecimales, es válido.

Por su respuesta, parece que está hablando de direcciones públicas. Las claves privadas parecen tener 64 de longitud. ¿Lo estoy leyendo mal?
Ah, de hecho tienes razón, me perdí la parte privada. Aún así, la respuesta es más o menos la misma. La clave privada sin procesar es un simple blob binario aleatorio de 256 bits. Entonces, si desea validar las claves sin procesar, todo es válido. Sin embargo, enviar las claves sin procesar es extremadamente peligroso, por lo que las personas tienden a crear archivos de claves y los utilizan para transportar las claves cifradas. La especificación para eso está en github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition . Sin embargo, para validar completamente el contenido del archivo, necesitaría la contraseña para descifrarlo + un cliente que pueda manejarlo. ¿Cuál es tu caso de uso?
Oki, tal vez edite su respuesta para que pueda votar. Mi caso de uso: escanee un QR, devuelva verdadero si es una clave privada válida para ethereum. Para claves no encriptadas lo logré con ` var patt = new RegExp(/^[a-f0-9]{64}$/i); var res = patt.test(privateKey);` Para claves encriptadas, bueno, depende de cómo estén encriptadas. También pregunté a los chicos de myetherwallet.com. ¿Que sugieres? ¿Hay una expresión regular para detectarlo?

También puede usar éteres para verificar. Como esto:

const ethers = require('ethers')

var pk = '0xcaed41dd92c1548cf7536c290e6a1871757fb5fea5721dea3a08c6d4abcd16cf'
let w = new ethers.Wallet(pk)

// Shorter than 32 bytes
pk = '0xcaed41dd92c1548cf7536c290e6a1871757fb5fea5721dea3a08c6d4abcd16'
w = new ethers.Wallet(pk)

// Incorrect hexidecimal string. Change last f to g. G is not hex 
pk = '0xcaed41dd92c1548cf7536c290e6a1871757fb5fea5721dea3a08c6d4abcd16cg'
w = new ethers.Wallet(pk)

El primer caso está bien y tendrá éxito.

El segundo arrojará un error.

  reason: 'exactly 32 bytes required',
  code: 'INVALID_ARGUMENT',

El tercero también arrojará un error:

  reason: 'invalid hexidecimal string',
  code: 'INVALID_ARGUMENT',

Puede detectar este error para validar su clave privada

pk = '0xcaed41dd92c1548cf7536c290e6a1871757fb5fea5721dea3a08c6d4abcd16cg'
try {
    w = new ethers.Wallet(pk)
}
catch (e) {
    console.log('Invalid private key.')
}