He visto bastantes ejemplos en los que se pasan tanto los datos como el hash de los datos.
La firma se verifica usando ecrecover
lo cual está bien.
El hash pasado también se verifica contra el hash calculado. No veo qué agrega esa segunda verificación en términos de integridad del mensaje y verificación del autor. Si el hash calculado se usa para verificar la firma y es incorrecto, la verificación de la firma debería fallar. Me estoy perdiendo de algo ?
function Check(string data, bytes32 hash, bytes32 r, bytes32 s, uint8 v) public returns (bool) {
var calculatedHash = keccak256(this, data);
// do we need this ?
assert(hash == calculatedHash);
// should not this one be sufficient ?
assert(msg.sender == ecrecover(calculatedHash, v, r, s));
}
Si necesita probar que los datos que está tratando de validar son los indicados, debe verificar que coincidan con el hash que produce una firma válida. De lo contrario, todo lo que está verificando es que la clave en cuestión firmó algo, pero no lo que firmaron.
La parte que su ejemplo podría haber omitido es pasar el hash a la función como parámetro. Simplemente podría haber calculado el hash nuevamente a partir de los datos y luego verificar que el hash se firmó con la clave correcta.
En algunos flujos de trabajo, es posible que haya creado el hash antes y lo haya almacenado como el identificador de su contrato en lugar de los datos. En ese caso, puede omitir el paso de los datos en esta etapa y simplemente trabajar con el hash.
Creo que la propiedad criptográfica que esta función intenta verificar es la integridad :
El cifrado de clave pública envolvente (EPKE) es el método de aplicar criptografía de clave pública y garantizar que una comunicación electrónica se transmita de forma confidencial, tiene el contenido de la comunicación protegido contra modificaciones (integridad de la comunicación)
Mirar la función de forma aislada (sin ningún contexto de proceso comercial) hace que sea difícil estar seguro de lo que esta función de verificación espera lograr, cómo se llama, etc. el cheque haciéndose pasar por otra cuenta
ecrecover devolverá la clave pública, junto con la clave privada, de la cuenta utilizada para firmar este mensaje; el problema de llamar a esta función de manera ingenua es una especie de " ataque de repetición" .
Como actor malintencionado, digamos que me beneficia poder suplantar la clave pública P.
Digamos también que hay un protocolo de comunicación en el que le damos un mensaje a los clientes y les pedimos que lo firmen para verificar su identidad para autenticarlos.
Digamos también que su sistema tomó ingenuamente el contenido de un mensaje devuelto por el cliente y no verificó que el hash coincidiera con el mensaje original.
Como actor malintencionado, podría suplantar a P buscando en la cadena de bloques los mensajes que M le ha devuelto e inyectar uno de esos en mi respuesta. Ecrecover devolvería la clave pública P y la función de verificación se subvertiría.
bruno grieder
Edmundo Edgar
garen vartanian
eth_sign
hash el mensaje antes de firmar?Edmundo Edgar