今天要实现通过ScatterDesktop,使用选中的账号私钥加密数据做签名,传到中心服务器,做身份验证
先粗略记下,稍后整理
首先由scatter.js发起 (View Code)
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)
然后到 eos.js (View Code)
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
版权属于:区块链开发网
本文链接:www.zhugexiaojue.com/index.php/archives/511.html
相关技术文章仅限于相关区块链底层技术研究,禁止用于非法用途,后果自负!本站严格遵守一切相关法律政策!
,
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持一下吧