如何使用 Lit Protocol 解密
基于 Lit Protocol 实现隐私数据分享,用户可以给满足指定条件的地址分享自己的隐私数据。
分享条件为指定的 EOA 地址可以访问。开发者在获得用户授权后,可以使用特定的 EOA 地址对接口返回内容进行解密。
例如,开发者的地址为:0xfd7daf19b5719623e7378450a2bab4403f240004 (私钥为:89a1a8c7d5f6ab952e02c5c6a71f48d60fbe06c21ec021374907d93d644b1236,对应的ApiKey:581c6c4fa0b54912b00088aa563342a4。注:该ApiKey仅用于开发者测试体验),下面为如何使用Lit Protocol 的 JS-SDK 对接口信息进行解密:
安装依赖
npm install @lit-protocol/lit-node-client base64-to-uint8array
示例代码
import LitJsSdk from '@lit-protocol/lit-node-client';
import * as u8a from "uint8arrays";
import ethers from "ethers";
import siwe from "siwe";
import toUint8Array from 'base64-to-uint8array'
const decryptString = async () => {
const encryptedString = "接口返回的加密信息";
const encryptedSymmetricKey = "接口返回的加密信息";
const chain = 'ethereum';
const authSig = await signAuthMessage();
const litNodeClient = new LitJsSdk.LitNodeClient();
await litNodeClient.connect();
const accessControlConditions = [
{
contractAddress: '',
standardContractType: '',
chain,
method: '',
parameters: [
':userAddress',
],
returnValueTest: {
comparator: '=',
value: '0xfd7daf19b5719623e7378450a2bab4403f240004'
}
}
]
// <String> toDecrypt
const toDecrypt = LitJsSdk.uint8arrayToString(toUint8Array(encryptedSymmetricKey), 'base16');
// <Uint8Array(32)> _symmetricKey
const _symmetricKey = await litNodeClient.getEncryptionKey({
accessControlConditions,
toDecrypt,
chain,
authSig
})
// <String> decryptedString
let decryptedString;
const blob = await LitJsSdk.base64StringToBlob(encryptedString);
try {
decryptedString = await LitJsSdk.decryptString(
blob,
_symmetricKey
);
} catch (e) {
console.log(e);
}
console.info("decryptedString:", decryptedString);
}
/**
* Get auth signature using siwe
* @returns
*/
const signAuthMessage = async () => {
// Replace this with you private key
const privKey = "89a1a8c7d5f6ab952e02c5c6a71f48d60fbe06c21ec021374907d93d644b1236";
const privKeyBuffer = u8a.fromString(privKey, "base16");
const wallet = new ethers.Wallet(privKeyBuffer);
const domain = "localhost";
const origin = "https://localhost/login";
const statement =
"This is a test statement. You can put anything you want here.";
const siweMessage = new siwe.SiweMessage({
domain,
address: wallet.address,
statement,
uri: origin,
version: "1",
chainId: "1",
});
const messageToSign = siweMessage.prepareMessage();
const signature = await wallet.signMessage(messageToSign);
console.log("signature", signature);
const recoveredAddress = ethers.utils.verifyMessage(messageToSign, signature);
const authSig = {
sig: signature,
derivedVia: "web3.eth.personal.sign",
signedMessage: messageToSign,
address: recoveredAddress,
};
return authSig;
}
decryptString();
Last updated