Signieren Sie ohne das Präfix „\x19Ethereum Signed Message“.

Ich habe verstanden, dass web3.eth.sign(...)das Präfix „\x19Ethereum Signed Message“ zu einer Nachricht und Hash mit keccak256 hinzugefügt wird. Gibt es eine Möglichkeit, das Präfix vor dem Signieren zu entfernen? Oder eine Bibliothek, mit der ich eine einfache Signatur ohne Präfix durchführen kann?

Antworten (3)

ethereumjs-util hat die hashPersonalMessageMethode, die das Präfix hinzufügt und signiert.

Sie können sich die Codebasis ansehen und sehen, wie dies implementiert ist:

exports.hashPersonalMessage = function (message) {
  var prefix = exports.toBuffer('\u0019Ethereum Signed Message:\n' + message.length.toString())
  return exports.sha3(Buffer.concat([prefix, message]))
}

Es ist ziemlich offensichtlich, wie Sie dieses Code-Snippet ändern können, um das Präfix nicht voranzustellen :)

Ich bin neu dabei, also muss ich die Quelle von ethereumjs-util ändern und irgendwie neu bereitstellen? Derzeit führe ich das Javascript auf Geth aus, wie kann ich die Codeänderung bereitstellen?
Es ist Javascript. Laden Sie das JS herunter und bearbeiten Sie es. Fügen Sie es in eine HTML-Datei ein oder importieren Sie es (unter Verwendung von require) in eine Knotenkonsole.

Nein, das Signieren ohne das Präfix „\x19Ethereum Signed Message“ ist unsicher und gefährlich.

Siehe zum Beispiel https://github.com/ethers-io/ethers.js/issues/555 von ricmoo:

Dies ist im Allgemeinen nicht möglich und unglaublich unsicher. :s

Grundsätzlich ermöglicht das Signieren von Rohnachrichten ohne Präfix einer App, alle Ether, Token und Assets zu stehlen, weshalb MetaMask Ihnen diese Operation nicht erlaubt und immer das Präfix einer signierten Nachricht erzwingt (selbst wenn die Nachricht ein Hash ist, wird es trotzdem vorangestellt, nur mit der eingebetteten Nachrichtenlänge von 32).

Noch von ethereumjs/ethereumjs-util:

exports.ecsign = function (msgHash, privateKey) {
  const sig = secp256k1.sign(msgHash, privateKey)

  const ret = {}
  ret.r = sig.signature.slice(0, 32)
  ret.s = sig.signature.slice(32, 64)
  ret.v = sig.recovery + 27
  return ret
}