- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用一些 bigint 公钥加密代码。使用按位掩码来确保计算时序和访问的内存地址与数据值无关是否安全?
这项技术是否容易受到基于指令时序、功率、RF 辐射或其他我不知道的因素的边信道攻击? (作为引用,我知道 RSA 盲法、EC 蒙哥马利阶梯、缓存刷新等技术。)
简单代码示例 (C/C++):
uint a = (...), b = (...);
if (a < b)
a += b;
现在翻译为使用恒定时间掩码:
uint a = (...), b = (...);
uint mask = -(uint)(a < b);
a = ((a + b) & mask) | (a & ~mask);
请注意 a < b
为0或1,掩码为0x00000000或0xFFFFFFFF。
类似地,对于高级操作(C++):
Integer x = (...);
if (x.isFoo())
x.doBar();
以下是可接受的安全翻译吗?
Integer x = (...);
uint mask = -(uint)x.isFoo(); // Assume this is constant-time
Integer y(x); // Copy constructor
y.doBar(); // Assume this is constant-time
x.replace(y, mask); // Assume this uses masking
最佳答案
这种技术可能是安全的...如果我们假设需要恒定时间的操作确实如此,并且如果编译器不更改代码来执行其他操作。
特别是,让我们看一下您的第一个示例:
uint a = (...), b = (...);
uint mask = -(uint)(a < b);
a = ((a + b) & mask) | (a & ~mask);
我看到两种可能无法在恒定时间内运行的合理方式:
比较a < b
取决于编译器(和 CPU),可能需要也可能不需要固定时间。如果它被编译为简单的位操作,它可能是常数时间的;如果它被编译为使用条件跳转,则很可能不是。
在高优化级别,过于聪明的编译器可能会检测到正在发生的事情(例如,根据比较将代码分成两个路径,并在将它们合并之前分别优化它们)并“优化“它回到我们试图避免的非常数时间码。
(当然,一个足够聪明的编译器也有可能将朴素的、看似非恒定时间的代码优化为恒定时间操作,如果它认为这样会更有效率的话!)
避免第一个问题的一种可能方法是用显式位操作代替比较,如:
uint32_t a = (...), b = (...);
uint32_t mask = -((a - b) >> 31);
a = ((a + b) & mask) | (a & ~mask);
但是,请注意,如果我们可以确定 a
,这仅等同于您的原始代码。和 b
相差小于 231。如果不能保证,我们必须在减法之前将变量转换为更长的类型,例如:
uint32_t mask = (uint32_t)(( (uint64_t)a - (uint64_t)b ) >> 32);
综上所述,即使这样也不是万无一失的,因为编译器仍然可以决定将此代码转换为非恒定时间的代码。 (例如,32 位 CPU 上的 64 位减法可能会花费可变时间,具体取决于是否存在借位——这正是我们在这里试图隐藏的内容。)
一般来说,确保不会发生此类时序泄漏的唯一方法是:
手动检查生成的汇编代码(例如,在您没有预料到的地方寻找跳转指令),以及
实际对代码进行基准测试以验证它确实需要相同的时间来运行,而不管输入如何。
显然,您还需要针对希望支持的编译器和目标平台的每种组合分别执行此操作。
关于c++ - 屏蔽对于阻止旁路攻击是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27865974/
粗略地说,单向数据绑定(bind)只是与 ng-model 绑定(bind)。当涉及 Controller 时,在页面内和 2-way 内。有人可以向我解释这个概念,以便我真正了解如何看待它吗?还有什
我想知道是否有任何替代 2 向 SSL 的方法。 2 向 SSL 是确保客户端和服务器可信通信的唯一选择吗?我有一个自签名证书供我的客户使用,我能否将自签名证书重新用于 2 种 SSL 方式,还是应该
如果是这样,你如何设置认证证书,你需要什么文件?是 .pfx 吗?您将如何在浏览器中安装它?一直试图通过浏览器测试 2 路 ssl。我有一个网络服务,尝试连接时总是返回认证身份验证失败。 最佳答案 扩
我希望能够对 XHTML 文档进行三向合并: 从文档的一些原始副本开始 一个用户编辑原始文档的副本 另一个用户编辑原始文档的单独副本 需要一个工具来合并(自动和/或可视化)两个用户所做的更改。 注意:
我有 4 张 table : ad (id, ...) website (id, title, URL, ...) space (id, website_id, ...) ad_space_count
我在 java 中有一个无状态服务,部署在 tomcat 网络服务器中,我还配置了 2 路 ssl 验证。到目前为止,一切正常。当我有一个新客户端时,我只需要将新客户端证书放入我的 trustore
我已经创建了一个带有证书的信任库和带有私钥的 keystore 。我已经放置了以下代码,加载了 trsustore 管理器和 keystore 管理器,然后创建了 SSL 上下文的实例。 每当我向网络
如果我在仅服务器身份验证中正确理解 SSL/TLS,握手后,服务器会向客户端发送它的公钥和由 CA 签名的数字签名证书。如果客户端有这个 CA 的公钥,它就可以解密证书并与服务器建立信任。如果它不信任
我有 Nginx,它使用双向 TLS 代理从客户端到 IBM DataPower 的请求。 从 Nginx 向 IBM DP 发送消息时出现错误:sll server (SERVER) ssl pee
我刚刚开始了一个项目,让我的雇主成为一个管理软件。我有一个琐碎但可能很简单的查询,我似乎找不到任何相关信息。 在对象之间建立“具有”关系的两种方式是否谨慎/良好做法。例如,Client 对象“有一个”
我在设置双向 SSL 身份验证时遇到问题。 我需要从 wso2 企业集成商访问 HTTPS 端点。 服务提供商给了我一个 pfx keystore ,其中包含我必须提供给服务器的证书和私钥。 我在我的
我正在为小型 PoC 构建 AWS Lambda 服务。 PoC 中的流程是: 通过 POST 获取(文本)输入, 执行小字符串操作 + 将操纵值存储到 DynamoDB 中,然后 通过 HTTP P
我的任务是在 Java 上下文中实现双向 TLS。我找到了一个示例 ( https://www.opencodez.com/java/implement-2-way-authentication-us
我正在尝试测试一个非常简单的双向 IM 应用程序。客户端在 android 上,服务器在我的 PC(java)上。我已经在 PC 到 PC 之间用 java 测试了这个应用程序,它工作正常。 但是在我
我有 java web 服务支持2-way ssl auth。所以我有客户端 keystore (client.p12),服务器证书在受信任的存储区中,服务器 keystore 中的客户端证书在受信任
通过 HTTPS 使用 Web 服务 我们有一个我们正在使用的网络服务。 Webservice 可以在 HTTP 和 HTTPS 协议(protocol)上运行。使用 HTTP 没问题,但如何使用 H
我在 Node.js 上有一个后端服务器,我正在尝试在 Nginx 和这个后端服务器之间设置 2 路 SSL。 但是我得到一个错误:2015/11/02 06:51:02 [错误] 12840#128
我一直在尝试连接到启用了 2 路 SSL 的服务端点。我正在使用 Spring resttemplate。我已将证书添加到 keystore 中,但出现以下错误: >org.springframewo
从 CherryPy 3.0 开始,只需指向服务器证书和私钥即可启用单向 SSL,如下所示: import cherrypy class HelloWorld(object): def ind
这个问题来自:MySQL Number of Days inside a DateRange, inside a month (Booking Table) 我有一个包含以下数据的表: CREATE
我是一名优秀的程序员,十分优秀!