今天要实现通过ScatterDesktop,使用选中的账号私钥加密数据做签名,传到中心服务器,做身份验证
先粗略记下,稍后整理
getArbitrarySignature(publicKey, data, whatfor = '', isHash = false){
throwNoAuth();
return SocketService.sendApiRequest({
type:'requestArbitrarySignature',
payload:{
publicKey,
data,
whatfor,
isHash
}
});
}
然后传到 ScatterDesktop (View Code)
static async [Actions.REQUEST_ARBITRARY_SIGNATURE](request, identityKey = null){
return new Promise(async resolve => {
const {payload} = request;
const {origin, publicKey, data, whatFor, isHash} = request.payload;
if(identityKey) payload.identityKey = identityKey;
else {
const possibleId = PermissionService.identityFromPermissions(origin, false);
if (!possibleId) return resolve({id: request.id, result: Error.identityMissing()});
payload.identityKey = possibleId.publicKey;
}
const keypair = KeyPairService.getKeyPairFromPublicKey(publicKey);
if(!keypair) return resolve({id:request.id, result:Error.signatureError("signature_rejected", "User rejected the signature request")});
const blockchain = keypair.publicKeys.find(x => x.key === publicKey).blockchain;
// Blockchain specific plugin
const plugin = PluginRepository.plugin(blockchain);
// Convert buf and abi to messages
payload.messages = [{
code:`${blockchain.toUpperCase()} Blockchain`,
type:'Arbitrary Signature',
data:{
signing:data
}
}];
PopupService.push(Popup.popout(Object.assign(request, {}), async ({result}) => {
if(!result || (!result.accepted || false)) return resolve({id:request.id, result:Error.signatureError("signature_rejected", "User rejected the signature request")});
resolve({id:request.id, result:await plugin.signer(payload, publicKey, true, isHash)});
}));
});
}
关键点在
plugin.signer(payload, publicKey, true, isHash)
async signer(payload, publicKey, arbitrary = false, isHash = false){
let privateKey = KeyPairService.publicToPrivate(publicKey);
if (!privateKey) return;
if(typeof privateKey !== 'string') privateKey = this.bufferToHexPrivate(privateKey);
if (arbitrary && isHash) return ecc.Signature.signHash(payload.data, privateKey).toString();
return ecc.sign(Buffer.from(arbitrary ? payload.data : payload.buf, 'utf8'), privateKey);
}
eosjs-ecc
Verify signed data.
ecc.verify(signature, 'I am alive', pubkey) === true
Recover the public key used to create the signature.
ecc.recover(signature, 'I am alive') === pubkey