【发布时间】:2019-04-24 14:44:21
【问题描述】:
我正在与一个使用以太坊标准 (secp256k1) 生成和签名的 HSM 进行交互。我正在使用一个名为 Graphene 的包与 HSM 进行交互。我使用其“pointEC”属性提取公钥:
0xc87c1d67c1909ebf8b54c9ce3d8e0f0cde41561c8115481321e45b364a8f3334b6e826363d8e895110fc9ca2d75e84cc7c56b8e9fbcd70c726cb44f5506848fa
我可以用来生成地址:0x21d20b04719f25d2ba0c68e851bb64fa570a9465
但是,当我尝试使用密钥对来自 dApp 的个人消息进行签名时,签名总是评估为不同的地址。例如,随机数/消息:
wAMqcOCD2KKz2n0Dfbu1nRYbeLw_qbLxrW1gpTBwkq有签名:
0x2413f8d2ab4df2f3d87560493f21f0dfd570dc61136c53c236731bf56a9ce02cb23692e6a5cec96c62359f6eb4080d80328a567d14387f487f3c50d9ce61503b1c
但它恢复了0xFC0561D848b0cDE5877068D94a4d803A0a933785的有效地址
这可能都是使用相同的私钥/公钥。当然,我只是附加了“1c”恢复值,但即使我尝试使用其他值,我也没有运气。这里还有几个例子:
Nonce: WRH_ApTkfN7yFAEpbGwU9BiE2M6eKTZMklPYK50djnx
Sig: 0x70242adabfe27c12e54abced8de87b45f511a194609eb27b215b153594b5697b7fb5e7279285663f80c82c2a2f2920916f76fd845cdecb45ace19f76b0622ac41c
Address: 0x1A086eD40FF90E75764260E2Eb42fab4Db519E53
Nonce: TZV6qhplddJgcKaN7qtpcIhudFhiQ
Sig: 0x3607beb3d58ff35ca1059f3ea44f41e79e76d8ffe35a4f716e78030f0fe2ca1da51f138c31d4ec4b9fc3546c4de1185736a4c4c7030a8b1965e30cb0af6ba2ee1c
Address: 0xa61A518cf73163Fd92461942c26C67c203bda379
我的签名信息代码:
let alg: graphene.MechanismType;
alg = graphene.MechanismEnum.ECDSA;
const session = get_session();
let key: graphene.Key | null = null;
//#region Find signing key
const objects = session.find({label: GEN_KEY_LABEL});
for (let i = 0; i < objects.length; i++) {
const obj = objects.items(i);
if ((obj.class === graphene.ObjectClass.PRIVATE_KEY ||
obj.class === graphene.ObjectClass.SECRET_KEY) &&
obj.handle.toString('hex') == params.handle
) {
key = obj.toType<graphene.Key>();
break;
}
}
if (!key) {
throw new Error("Cannot find signing key");
}
var sign = session.createSign(alg,key);
if (!params.data) {
console.log("No data found. Signing 'test' string");
params.data = 'test';
}
sign.update(Buffer.from(params.data.toString().trim()));
var signature = sign.final();
console.log(signature.toString('hex'));
请记住,即使只有 1 个密钥,它也会失败。
【问题讨论】:
-
您可能需要共享您用于签署消息的代码以及用于恢复签名者的代码。
-
恢复签名者的代码就是web3的JS库。
-
很难说没有看到代码,但你对
web3所做的可能是期望签名的数据首先用 keccak256 散列,然后以 "\x19Ethereum 签名消息:32 \n”。您的签名代码中肯定没有这样做。 -
被签名的数据已经是那种格式。所有这一切都是将其发送到 HSM 进行签名并返回签名。
-
那么
params.data.toString()的实际值是多少?究竟是什么传递给sign.update?
标签: javascript encryption cryptography ethereum hsm