¿Es posible demostrar la propiedad del hash de clave pública sin clave pública?

Estoy creando un sistema en el que me gustaría que el usuario especifique un hash de clave pública de una billetera sobre la que tenga control en caso de propinas, reembolsos y/o de otra manera necesite devolverle valor.

A partir de ahí, me gustaría proporcionar una función que permita al usuario verificar que posee esta dirección cifrada.

Si entiendo correctamente, pueden probar esto firmando un mensaje que les envío, y luego podrían enviarme la firma junto con la clave pública.

Sin embargo, también entiendo que exponer su clave pública se considera menos que ideal .

Por lo tanto, tengo curiosidad por saber si hay alguna solución en algún lugar que me permita verificar la propiedad solo en función de la dirección hash, sin el uso de una clave pública.

Supongo que dado que este proceso de verificación es transitorio y no se almacenará permanentemente en una cadena de bloques pública (o en cualquier otro lugar), no es un escenario potencialmente dañino (o más bien, más "confiable" para el usuario). Sin embargo, quiero ser lo más consciente posible de su privacidad y seguridad y brindarles la oportunidad de verificar su propiedad en esta dirección codificada de la manera menos invasiva disponible.

¿Es suficiente simplemente indicar en algún lugar de la interfaz de usuario que este proceso de verificación no almacenará la clave pública de ninguna manera? Todo esto supone una conexión HTTPS, pero, por supuesto, el riesgo es que, dado que los malhechores sabrán que se están transmitiendo claves públicas, abre un vector potencial más de posible ataque.

Además, estoy muy interesado en otros enfoques preferidos/conocidos aquí, así como en cualquier ejemplo de otros sitios y/o servicios que hayan abordado este problema de manera elegante.

¿Es aceptable el uso de una autoridad central?
Claro, @DavidSchwartz, no dudes en compartir. Soy nuevo en este espacio y estoy interesado en aprender diferentes enfoques. Como este será mi primer proyecto, probablemente tendrá un enfoque híbrido para ponerme de pie, por lo que algunos elementos serán centrales.

Respuestas (2)

La respuesta simple es no.

Se supone que un algoritmo hash es una función unidireccional. Si es posible recrear la clave pública a partir del hash, esto significa que el algoritmo de hash está roto.

Sin embargo, hay un aspecto que puede resultarle útil. Para las firmas de mensajes, bitcoin utiliza una codificación personalizada (en comparación con la firma codificada DER que se encuentra en las transacciones).

Dada una firma de mensaje codificada personalizada, el mensaje y un hash de clave pública, puede verificar que la firma sea correcta. Sin embargo, tenga en cuenta que esto se debe a que la firma codificada personalizada admite la recuperación de clave pública. Por lo tanto, esto da como resultado los mismos aspectos de seguridad que simplemente proporcionar la clave pública, pero con el beneficio de que el usuario no necesita transferirle específicamente la clave pública.

Si desea probar las firmas codificadas personalizadas, la función "signmessage" las devuelve en el cliente central de bitcoin. Luego se pueden verificar mediante la función "verifymessage" o mediante múltiples herramientas en línea, como esta: https://blockexplorer.com/messages/verify

1) Genere una clave privada aleatoria solo para probar la propiedad.

2) Cree un mensaje con la clave pública correspondiente a la clave generada en el paso uno y la clave pública de la que desea probar la propiedad.

3) Firmarlo con ambas claves privadas.

4) Enviarlo a una autoridad central.

5) Reciba de la autoridad central una declaración firmada que indique que el propietario de la clave pública correspondiente a la clave privada que generó en el paso 1 pertenece a la cuenta de la que desea probar la propiedad.

6) Ahora puede usar la clave que generó en el paso 1 para demostrar la propiedad de la cuenta sin revelar la clave pública de la cuenta a nadie, ya que la declaración firmada de la autoridad central vincula la clave que generó en el paso 1 a la cuenta, lo que demuestra el control común. .

Muy bien, creo que tengo la cabeza enfocada principalmente en esto, @david-schwartz. Gracias por proporcionar este flujo de trabajo. Mi confusión está en el segundo paso. ¿Debería decir "y el hash de clave pública del que desea demostrar la propiedad"? Si el usuario envía la clave pública de la cuenta en cuestión, todavía está usando su clave pública para demostrar la propiedad de una dirección cifrada, que es lo que estoy tratando de evitar. O, ¿la implicación/suposición aquí es que el usuario debe almacenar esta declaración firmada en algún lugar para usarla en una fecha posterior, como en este escenario?
@ Mike-EEE El usuario debe proporcionar su clave pública a la autoridad central; de lo contrario, la autoridad central no puede verificar la firma en la solicitud. Pero al proporcionar pruebas a otros, solo pueden usar la declaración de la autoridad sin tener que revelar la clave pública.