- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
Secure Multi-party Computation in Federated Learning 。
安全多方计算就是许多参与方需要共同工作完成一个计算任务或者执行一个数学函数,每个参与方针对这个执行构建自己的数据或份额,但不想泄露自己的数据给其他参与方.
在安全多方计算中的定义包括以下几个方面:
研究人员通常利用真实/理想的模型范式来探索安全协议的安全性.
举个例子:在理想模型中,假设有一个可信服务器能够聚合各参与方并且产生正确预期输出;在真实模型中,不存在可信服务器,参与方可以通过点对点方式交换输入和信息来达到这种形式.
安全多方计算中有三个安全模型:
不经意传输(OT):发送者S想发送n个消息中的一个给接受者R,目标是S不知道哪个消息被R接收,而且R没有获得S发送的其他n-1个消息中的任何信息.
一个标准的二选一函数被描述为 \(F_{ot}\) 如下:
实现OT协议的方法有很多,例如RAS或基于离散对数问题的方法.
双方将共同协作实现:一方将设计一个逻辑电路,另一方将检查并使用该逻辑电路.
秘密共享(Secret Sharing, SS)是密码学中的一个重要元素。对称或非对称加密更侧重于两方之间的秘密共享。然而某些时候,例如在联邦学习中则需要在多个参与者之间共享一个秘密,此时就需要秘密共享.
一般来说,有三种类型的秘密共享协议:算术秘密共享、Shamir秘密共享和Goldreich-Micali-Wigderson(GMW)共享。算术秘密共享是利用数论的特征在两方之间共享一个秘密,而GMW共享主要使用XOR来隐藏私有值,而Shamir秘密共享可能是实践中最流行的秘密分享的原语。 在Shamir秘密共享中,一个秘密 \(s\) 将被分割成 \(n\) 个份额,这样任何 \(t\) 个份额都可以用来重建秘密 \(s\) ;然而,任何小于 \(t\) 的份额都不能获得关于 \(s\) 的信息.
\((t,n)\) 门限Shamir秘密共享方案 : 由于每个参与者 \(P_i\) 都知道一对 \((x_i,y_i)\) ,因此,当我们有 \(t\) 对 \((x_i,y_i)\) 时就可以获得秘密值 \(K\) 。然而,对于任意 \(t-1\) 对 \((x_i,y_i)\) ,我们则不能确定 \(K\) (给定一个很大的素数 \(p\) 有很多可能性).
另一种流行的秘密共享方法是使用拉格朗日插值法 。我们用一个简单的例子来说明这项技术。假设 \(t=3\) ,那么我们找到一个阶数为3的多项式如下:
,其中 \(d=f(0)\) 是秘密值.
分配者可以在 \(X\) 轴上随机选择 \(n\) 个点,如 \(x_1,x_2,...,x_n\) 。根据 \(a\) 、 \(b\) 、 \(c\) 、 \(d\) 的知识,分配者可以轻松获得 \(n\) 对数据 \((x_1,f(x_1)),(x_2,f(x_2)),...,(x_n,f(x_n))\) 。然后他将把 \(n\) 对秘密份额分配给 \(n\) 个秘密持有人.
两种方法的主要区别:
目前同态加密的性能有很大挑战,阻碍了实践中的部署.
假设我们有两个客户端 \(u\) 和 \(v\) ,他们分别想将 \(x_u\) 和 \(x_v\) 上传到联邦学习服务器。为了不向服务器泄露他们的原始秘密值, \(u\) 和 \(v\) 将协议产生一个虚拟数据 \(s_{uv}\) ,其中一个客户端会将虚拟数据添加到真实数据中来输出,例如, \(y_u = x_u + s_{uv}\) ,而另一个客户端将输出 \(y_v = x_v − s_{uv}\) 。在服务器端,诚实但好奇的服务器通过将接收到的 \(y_u\) 和 \(y_v\) 相加,即可得到正确的聚合结果 \(x_u + x_v\) ,与此同时服务器无法从接收到的消息中得到 \(x_u\) 和 \(x_v\) .
对掩蔽方法进一步推广:假设有多个客户端参与该任务,使用客户端集合 \(\mathcal{U}\) 表示。我们将对集合中的每一对客户端 \((u,v)\) 生成一个共享的虚拟向量 \(s_{uv}\) 。此外我们还需要一个规则来决定谁将添加或减去共享的虚拟向量。一种解决方案是,我们随机地给每个客户端分配一个顺序,我们得到一个有序的用户列表 \(1,2,...,|\mathcal{U}|\) 。对于列表中的用户 \(i\) ,他将添加用户 \(1,2,...,i−1\) 的共享虚拟向量,并减去与用户 \(i + 1,i + 2,...,|\mathcal{U}|\) 共享的虚拟向量。换句话说,用户 \(u\) 的掩码输出是:
我们注意到, 上述掩蔽的正项或负项的数量是动态的,并取决于用户 \(u\) 在有序列表中的位置(每个不同位置的客户端正项和负项的数量都是不同的,但最后总和一定是互相抵消的,因为每个加减是成对出现的,例如客户端1要减掉其与客户端2共享的虚拟向量,客户端2要加上这个虚拟向量 )。在服务器端,聚合的方式如下:
这里贴一下我理解的成对掩码加减的示意图,以便于理解:
此外注意:这里的每对客户端之间生成的虚拟向量应该是不保存的,直接加在真实值上面,因此如果发生掉线情况,就会出问题 .
由于掩码是成对出现的,所以如果出现参与方掉线的情况就聚合之后的总和会出现问题,因此最重要的就是解决参与方掉线的问题.
根据前文,可以使用秘密共享来解决客户端掉线问题.
在系统启动阶段,一个给定用户 \(u\) 将利用一个秘密共享方案来分发他的每个秘密值的 \(t\) 份额共享( \(u\) 与其他用户之间有一个秘密值 \(s_{uv},u \neq v\) )。在掩蔽方案中,只有当所有预期的参与方都成功地上传了其所掩蔽的数据时,才能正确地完成聚合。否则,仅有部分参与方参与求和就远远不能得到正确的答案,因为一个缺失的参与者可能会导致很大的差异.
也就是说如果有一个客户端 \(u\) 掉线,那么与之相关的有 \(n-1\) 个秘密需要被恢复。而针对于用户 \(u\) 相关的其中一个秘密 \(s_{u,v}\) 来说,服务器至少需要从活跃参与方收集至少 \(t\) 个份额。即服务器总共需要手机 \(t×(n-1)\) 个份额才能完整复原所有与 \(u\) 有关的秘密值,从而使最终求和正确。这样开销显然太大了。 这里我本来有个疑问:此处为什么不用与他结对的客户端持有的值直接恢复? 我思考了一下之后觉得与它结对的客户端并不持有这个虚拟向量(我感觉这个虚拟向量就是个一次性的随机数),虚拟向量使用完之后两方都不存储。两方只是在生成之后根据这个虚拟向量值生成了秘密共享份额以备恢复它,但原始的虚拟向量值就销毁了,加完或减完只保留 \(y_u\) 值,不保留 \(x_u\) 值和 \(s_{u,v}\) 。 此外有一种潜在的攻击是服务器可能声称用户 \(u\) 掉线了(其实没掉线),从而获得客户端 \(u\) 的与其他客户端的所有 \(n-1\) 个秘密值(虚拟向量)。而攻击者可以通过这 \(n-1\) 个虚拟向量以及各个客户端上传的内容求得各个客户端持有的真实值(需要上传的真实值):
为了应对这种攻击,提出了一种 双掩蔽方法 (待后续学习).
为了处理掉线带来的昂贵代价,Zheng等人提出了一个轻量级的加密解决方案:
思路类似于DH密钥交换协议,每个客户端生成一个私钥和一个公钥,每两方通过密钥交换得到一个公共密钥,这个公共密钥就作为虚拟向量,这样子后续如果有一方掉线,而另一方知道这个公共密钥,可以直接恢复.
最后此篇关于联邦学习中的安全多方计算的文章就讲到这里了,如果你想了解更多关于联邦学习中的安全多方计算的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在学习 Spring 安全性,但我对它的灵活性感到困惑.. 我知道我可以通过在标签中定义规则来保护网址 然后我看到有一个@secure 注释可以保护方法。 然后还有其他注释来保护域(或 POJO)
假设有一个 key 加密 key 位于内存中并且未写入文件或数据库... byte[] kek = new byte[32]; secureRandom.nextBytes(kek); byte[]
我有 Spring Security 3.2.0 RC1 的问题 我正在使用标签来连接我 这表示“方法‘setF
我正在创建一个使用 Node Js 服务器 API 的 Flutter 应用程序。对于授权,我决定将 JWT 与私钥/公钥一起使用。服务器和移动客户端之间的通信使用 HTTPS。 Flutter 应用
在过去的几年里,我一直在使用范围从 Raphael.js 的 javascript 库。至 D3 ,我已经为自己的教育操纵了来自网络各地的动画。我已经从各种 git 存储库下载了 js 脚本,例如 s
在 python 中实现身份验证的好方法是什么?已经存在的东西也很好。我需要它通过不受信任的网络连接进行身份验证。它不需要太高级,只要足以安全地获取通用密码即可。我查看了 ssl 模块。但那个模块让我
我正在尝试学习“如何在 Hadoop 中实现 Kerberos?”我已经看过这个文档 https://issues.apache.org/jira/browse/HADOOP-4487我还了解了基本的
我有一个带有 apache2、php、mysql 的生产服务器。我现在只有一个站点 (mysite.com) 作为虚拟主机。我想把 phpmyadmin、webalizer 和 webmin 放在那里
前些天在网上看到防火墙软件OPNsense,对其有了兴趣,以前写过一个其前面的一个软件M0n0wall( 关于m0n0wa
我在 Spring Boot 和 oauth2(由 Google 提供)上编写了 rest 后端,在 "/login" 上自动重定向。除了 web 的 oauth 之外,我还想在移动后端进行 Fire
我想调用类 Foo,它的构造函数中有抽象类 Base。我希望能够从派生自 Base 的 Derived 调用 Foo 并使用 Derived覆盖方法而不是 Base 的方法。 我只能按照指示使用原始指
如何提高 session 的安全性? $this->session->userdata('userid') 我一直在为我的 ajax 调用扔掉这个小坏蛋。有些情况我没有。然后我想,使用 DOM 中的
我目前正在为某些人提供程序集编译服务。他们可以在在线编辑器中输入汇编代码并进行编译。然后编译它时,代码通过ajax请求发送到我的服务器,编译并返回程序的输出。 但是,我想知道我可以做些什么来防止对服务
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
目前,我通过将 session 中的 key 与 MySQl 数据库中的相同 key 相匹配来验证用户 session 。我使用随机数重新生成 session ,该随机数在每个页面加载时都受 MD5
Microsoft 模式与实践团队提供了一个很棒的 pdf,称为:“构建安全的 asp.net 应用程序”。 microsoft pdf 由于它是为 .Net 1.0 编写的,所以现在有点旧了。有谁知
在 Lua 中,通常会使用 math.random 生成随机值和/或字符串。 & math.randomseed , 其中 os.time用于 math.randomseed . 然而,这种方法有一个
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我们有一个严重依赖 Ajax 的应用程序。确保对服务器端脚本的请求不是通过独立程序而是通过坐在浏览器上的实际用户的好方法是什么 最佳答案 真的没有。 通过浏览器发送的任何请求都可以由独立程序伪造。 归
我正在寻找使用 WebSockets 与我们的服务器通信来实现 web (angular) 和 iPhone 应用程序。在过去使用 HTTP 请求时,我们使用请求数据、url、时间戳等的哈希值来验证和
我是一名优秀的程序员,十分优秀!