本文讨论了在公民身份管理中使用BBS+签名实现选择性披露身份信息的方案。文章指出,政府应提供身份验证而非拥有公民身份,英国政府目前在这方面存在问题。文章介绍了BBS+签名技术,它允许签名者在不泄露全部信息的情况下验证部分身份信息,同时使用密码学wasm集成和JavaScript来实现,从而在交易中建立信任并保护隐私。
因此,英国终于推出了一个“某种程度上”的身份计划,但他们真的有权控制我们的身份,并向他人透露关于它的一切吗? 答案可能是否定的,但政府仍将试图维持对其公民身份的控制(就像他们几个世纪以来所做的那样,因为他们需要征税并经常监视其公民)。
总的来说,政府应该提供身份证明,而不是成为公民身份的所有者,因为政府的身份检查流程可能比仅仅出示水电费账单作为地址证明的一部分更可靠。英国的这种做法是有缺陷的,因为他们想成为公民身份钱包的所有者,而不是公民拥有自己的可以包含政府证明的身份钱包。
因此,让我们看看如何让公民有权决定他们透露自己身份的哪些部分...... BBS+ 签名[ 这里]:
随着 WASM (WebAssembly) 的集成,一个充满机遇的世界打开了,Web 3.0 的世界真正活跃起来! 在本例中,我们将在浏览器中使用 BN256 曲线来实现 BBS(Boneh、Boyen 和 Shacham)签名。 通过这些签名,我们可以同时签署多个消息,然后可以显示已签名消息的子集,并使用单个、恒定大小的数字签名。 BBS 签名由 B oneh、B oyen 和 S hacham 在这篇经典论文中定义[ 这里]:
该方法随后由 Camenisch 和 Lysyanakaya 推进,现代实现基于以下方法,例如[ 这里]:
例如,英国政府可以对Alice的很多属性进行数字签名,例如她的性别、她的姓名、她的地址、她的电话号码和她的 NI 号码。然后,Alice可以在选择显示其已签名身份的部分时,创建关于签名的零知识证明。 这样,Alice可以控制她透露自己身份的哪个部分。 例如,如果她只需要透露他的电话号码才能申请信用卡,她可以有选择地只透露那部分,但其余部分被屏蔽掉。 验证者仍然可以检查凭证是否已由英国政府签名:
该方法使用带有双线性映射的群签名方法。 这会生成一个与 RSA 签名大小大致相同的签名(大约 200 字节)。 在椭圆曲线方法中,我们有两条曲线:G1 和 G2。 如果我们在 G 1 上有 U 1 和 U 2 点,在 G 2 上有 V 1 和 V 2 点,我们得到如下的双线性映射:
e( U 1+ U 2, V 1)= e( U 1, V 1)× e( U 2, V 1)
e( U 1, V 1+ V 2)= e( U 1, V 1)× e( U 1, V 2)
如果 U 是 G 1 上的一个点,并且 V 是 G 2 上的一个点,我们得到:
e( aU, bV)= e( U, V) ^{ab}
在 BBS 中,使用椭圆曲线对,我们有 G1 和 G2,它们是 BN256 曲线,它们映射到 GT,GT 也在 BN256 曲线 上。 这是配对函数。
通过群签名,我们使用定义的私钥创建群的成员资格。 这些被定义为成员,并且从签名的公钥来看,无法从签名中看到任何成员的签名。
群签名使用群管理器,该管理器负责代表成员签署内容。 群签名的关键特征是:
对于群签名,我们创建一个群私钥,该私钥与每个成员的私钥不同。 然后,群私钥可以生成私钥,也可以用于揭示消息的签名者。 有了这些,我们还必须撤销成员的私钥,这可以通过公开声明撤销来完成。 然后,这还可以创建一个新的群私有地址,并撤销成员的私钥。
在本例中,我们将使用 Crypt-WASM 集成[ 这里]并与 JavaScript 集成[ 这里]:
<script type="module">
function buf2hex(buffer) {
var u = new Uint8Array(buffer),
a = new Array(u.length),
i = u.length;
while (i--) // map to hex
a[i] = (u[i] < 16 ? '0' : '') + u[i].toString(16);
u = null; // free memory
return a.join('');
};
(async function () {
const docknetworkcryptoWasm = await import("https://cdn.jsdelivr.net/npm/@docknetwork/crypto-wasm@0.33.0/+esm");
async function update() {
// 加载 WASM 模块
await docknetworkcryptoWasm.initializeWasm();
const message1 = new TextEncoder().encode(document.getElementById("message1").value);
const message2= new TextEncoder().encode(document.getElementById("message2").value);
// 生成随机消息
const messages = [\
new TextEncoder().encode(message1),\
new TextEncoder().encode(message2)\
];
const label = new TextEncoder().encode("Label");
const messageCount = messages.length;
// 使用标签确定性地生成参数
const sigParams = docknetworkcryptoWasm.bbsPlusGenerateSignatureParamsG1(messageCount, label);
console.log('params is', sigParams);
// 生成一个新的密钥对
const sk = docknetworkcryptoWasm.bbsPlusGenerateSigningKey();
const pk = docknetworkcryptoWasm.bbsPlusGeneratePublicKeyG2(sk, sigParams);
document.getElementById('PrivateKey').innerText = buf2hex(sk);
document.getElementById('PublicKey').innerText = buf2hex(pk);
const sig = docknetworkcryptoWasm.bbsPlusSignG1(messages, sk, sigParams, true);
document.getElementById('Signature').innerText = buf2hex(sig);
const isVerified = docknetworkcryptoWasm.bbsPlusVerifyG1(messages, sig, pk, sigParams, true);
document.getElementById('Verified').innerText = isVerified;
}
document.getElementById("message1").addEventListener("input", update);
document.getElementById("message2").addEventListener("input", update);
document.getElementById("message1").innerText = "Hello";
document.getElementById("message2").innerText = "Hello123";
document.getElementById("genkey").addEventListener("click", update);
update();
message1.focus();
})();
</script>
代码在这里:
使用带有 JavaScript 的 WASM 的 BBS+ 签名 \ \ 我们可以为一群成员生成一个数字签名,然后不可能知道谁签署了…\ \ asecuritysite.com
在本例中,我们可以签署两条消息,然后验证它们:
BBS(以及一般的群签名)解决了在我们的交易中创建信任,同时保留隐私权的问题。 总的来说,我们的政府不应该拥有我们的身份,而应该证明我们身份的一部分,这可以被其他人信任。 不幸的是,英国政府似乎正在采取另一种策略,并希望拥有公民的数字身份及其钱包。 幸运的是,欧盟的做法有所不同,它支持钱包的广泛使用,并支持保留受信任签名者公钥的区块链基础设施。
[1] Boneh, D., Boyen, X., & Shacham, H. (2004, August). Short group signatures. In Annual international cryptology conference (pp. 41–55). Berlin, Heidelberg: Springer Berlin Heidelberg.
- 原文链接: billatnapier.medium.com/...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!