web3.eth.sign не возвращает действительную подпись - или как это работает?

EDIT: Решена проблема; рабочий пример входа ниже

Я использую sha3 сообщения, которое хочу подписать с eth.sign m = web3.sha3("Please work.")

Затем я запускаю eth.sign(eth.coinbase, m)

И он возвращает меня: 0x1c28d6720234343026c24718728cf0c251b0d09c87c32a6e380396a3360065290d0e7ec99a48e547e36645cecc11fd8d09742955c3d16c32eb75d9b24dd158d754

Теоретически, я мог бы получить от него действительность подписи.

r = 0x1c28d6720234343026c24718728cf0c251b0d09c87c32a6e380396a336006529

s = 0x0d0e7ec99a48e547e36645cecc11fd8d09742955c3d16c32eb75d9b24dd158d7

v = 54 ?! (У меня было впечатление, что это будет 0 или 1. Для ecrecover я пробовал 27 и 28)

Теперь я подключаю их к ecrecover (m, v, r, s), и я получаю ...

С 27: 0x8c6c953abf2957f7fec4c689f8fe2ff09b81b245

С 28: 0xb8feaa9b9bfd7f10caefdc6d7baa1f74c37cedef

Что происходит в мире? Я пытаюсь внедрить логин для своего приложения, используя web3, и это основной дорожный блок. Я надеюсь, что гении могут исправить меня, где я ошибаюсь.

Спасибо.

5 голосов | спросил Scientaster 31 MaramFri, 31 Mar 2017 01:01:22 +03002017-03-31T01:01:22+03:0001 2017, 01:01:22

1 ответ


2

Я сам наткнулся на ответ, см. рабочий код ниже . Я следил за этим руководством , который я бы не рекомендую!

Я также использовал четность в режиме geth для подписи данных, которые я также не рекомендовал бы. Переход на простой старый geth RPC дал мне более разумные результаты.

Как говорится, остерегайтесь v! . Существует ошибка между реализациями geth, которая вернет либо 00/01, либо 1b /1c для v. Я решил свою проблему, используя метод fromRpcSig ethereumjs-util, какие учетные записи для ошибки. Если следующее не работает, попробуйте импортировать web3 и использовать его метод sha3 с помощью ethUtils toBuffer.

Ниже приведен полный фрагмент кода на стороне клиента и стороне сервера, который реализует логин:

КЛИЕНТ

function login() {
  let data = web3.sha3('hello world');
  web3.eth.sign(web3.eth.defaultAccount, data, (err, result) => {
    if (!err) {
      axios.post(url + '/login', {
        addr: web3.eth.defaultAccount,
        sig: result
      }).then((res) => {
        console.log(res);
      });

    }
  });
}

SERVER

var ethUtils = require('ethereumjs-util');

let addr = req.body.addr;
let sig = req.body.sig;

let signature = ethUtils.fromRpcSig(sig);

let data = 'hello world';

let pubKey = ethUtils.ecrecover(
  ethUtils.sha3(data),
  signature.v,
  signature.r,
  signature.s);

let foundAddr = '0x' + ethUtils.pubToAddress(pubKey).toString('hex');

if (foundAddr === addr) {
  // Hooray! The user's signature proves they are who they say they are!
} else {
  // Not authenticated successfully
}
ответил Scientaster 1 PMpSat, 01 Apr 2017 19:27:30 +030027Saturday 2017, 19:27:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132