Как восстановить публичный адрес из подписи - PullRequest
0 голосов
/ 23 мая 2019

У меня есть вопрос о восстановлении публичного адреса из подписи. Я следую этому уроку https://www.toptal.com/ethereum/one-click-login-flows-a-metamask-tutorial. Для внешнего интерфейса я использую Angular и для внутреннего Java
В front-end я отправляю подпись, подписанную с помощью web3js.

this.web3Service.getWeb3().eth.personal.sign(
      this.web3Service.getWeb3().utils.fromUtf8('I am signing my one-time nonce ' + this.currentUser.nonce),
      this.currentUser.ethereumAddress
    ).then(signature => {
      this.authenticationService.authenticate(signature, this.currentUser.ethereumAddress).subscribe();
    });

В серверной части я получаю подпись и публичный адрес пользователя. Я пытаюсь воссоздать этот код в Java

 const msg = `I am signing my one-time nonce: ${user.nonce}`;

// We now are in possession of msg, publicAddress and signature. We
// can perform an elliptic curve signature verification with ecrecover
const msgBuffer = ethUtil.toBuffer(msg);
const msgHash = ethUtil.hashPersonalMessage(msgBuffer);
const signatureBuffer = ethUtil.toBuffer(signature);
const signatureParams = ethUtil.fromRpcSig(signatureBuffer);
const publicKey = ethUtil.ecrecover(
  msgHash,
  signatureParams.v,
  signatureParams.r,
  signatureParams.s
);
const addressBuffer = ethUtil.publicToAddress(publicKey);
const address = ethUtil.bufferToHex(addressBuffer);

// The signature verification is successful if the address found with
// ecrecover matches the initial publicAddress
if (address.toLowerCase() === publicAddress.toLowerCase()) {
  return user;
} else {
  return res
    .status(401)
    .send({ error: 'Signature verification failed' });
}

Есть ли в Java эквивалент для получения открытого ключа из подписи и сообщения?

...