使用BBS+签名实现选择性披露身份信息的方案

本文讨论了在公民身份管理中使用BBS+签名实现选择性披露身份信息的方案。文章指出,政府应提供身份验证而非拥有公民身份,英国政府目前在这方面存在问题。文章介绍了BBS+签名技术,它允许签名者在不泄露全部信息的情况下验证部分身份信息,同时使用密码学wasm集成和JavaScript来实现,从而在交易中建立信任并保护隐私。

市民手中的身份

因此,英国终于推出了一个“某种程度上”的身份计划,但他们真的有权控制我们的身份,并向他人透露关于它的一切吗? 答案可能是否定的,但政府仍将试图维持对其公民身份的控制(就像他们几个世纪以来所做的那样,因为他们需要征税并经常监视其公民)。

总的来说,政府应该提供身份证明,而不是成为公民身份的所有者,因为政府的身份检查流程可能比仅仅出示水电费账单作为地址证明的一部分更可靠。英国的这种做法是有缺陷的,因为他们想成为公民身份钱包的所有者,而不是公民拥有自己的可以包含政府证明的身份钱包。

因此,让我们看看如何让公民有权决定他们透露自己身份的哪些部分...... BBS+ 签名[ 这里]:

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)

如果 UG 1 上的一个点,并且 VG 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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
billatnapier
billatnapier
江湖只有他的大名,没有他的介绍。