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?
ethereumjs-util hat die hashPersonalMessage
Methode, 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 :)
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
}
Consy
Thomas Cloes