Mobile 如何设计一个安全的&;服务器和移动应用程序之间的轻量级协议?

Mobile 如何设计一个安全的&;服务器和移动应用程序之间的轻量级协议?,mobile,ssl,encryption,https,protocols,Mobile,Ssl,Encryption,Https,Protocols,在设计服务器和iOS/Android客户端之间的通信协议时,我陷入了两难境地 我想制定协议: 安全:因为我们会发送重要信息 轻量级:让iOS/android客户端响应更好的用户体验 我甚至起草了一个解决方案,在HTTP REST接口上使用一些加密/编码/压缩算法。简言之,使用DH算法或RSA保护对称密钥的传输,以便稍后在会话中对消息进行加密。有点像iOS官方的例子 然而,当我在Stackoverflow中搜索类似的问题时,我发现几乎所有的建议都是“使用HTTPS”,而不是“自己重新发明轮子”

在设计服务器和iOS/Android客户端之间的通信协议时,我陷入了两难境地

我想制定协议:

  • 安全:因为我们会发送重要信息
  • 轻量级:让iOS/android客户端响应更好的用户体验
我甚至起草了一个解决方案,在HTTP REST接口上使用一些加密/编码/压缩算法。简言之,使用DH算法或RSA保护对称密钥的传输,以便稍后在会话中对消息进行加密。有点像iOS官方的例子

然而,当我在Stackoverflow中搜索类似的问题时,我发现几乎所有的建议都是“使用HTTPS”,而不是“自己重新发明轮子”

我同意重新发明轮子是不明智的,但我不确定HTTPS是否能在恶劣的网络条件下正常工作,这通常是移动应用所面临的问题? HTTPS将在每次建立连接时传输密钥。它真的适合HTTP REST API吗?HTTP REST API速度快,有效负载小? 还有别的毛病吗

提前感谢您的回复

…或RSA来保护对称密钥的传输

您可能应该坚持使用提供前向保密性的密码套件。它的标准实践是使用短暂的密钥交换,如DHE和ECDHE。我相信TLS工作组不赞成TLS1.3中的RSA密钥传输。见TLS工作组


轻量级:让iOS/android客户端响应更好的用户体验

痛点是钥匙交换,你可能无法避免

对于批量加密,也许您应该使用新的ChaCha/Poly1305密码套件,如
TLS\u ECDHE\u ECDSA\u与CHACHA20\u Poly1305
TLS\u ECDHE\u RSA\u与CHACHA20\u Poly1305
TLS\u DHE\u RSA\u与cha20\u Poly1305
。它们的速度是4倍左右。看


我甚至起草了一个解决方案,在HTTP REST接口上使用一些加密/编码/压缩算法

WebCrypto距离标准化还有几个月。之后,浏览器必须采用它。因此,您可能在几个月到几年内都不会有原语

对于自定义DH,您将缺少大整数。即使WebCrypto发布其第一个标准,也不会包含大整数。看见(顺便说一句,我有一个用于多因素身份验证的自定义DH方案。这也是我需要这些大整数的原因)


我甚至起草了一份包含一些加密/编码/压缩算法的解决方案

我希望您认识到压缩会在更高的层中泄漏信息。例如,参见Rizzo和Duong关于HTTP和SPDY协议的文章


然而,当我在Stackoverflow中搜索类似的问题时,我发现几乎所有的建议都是“使用HTTPS”,而不是“自己重新发明轮子”

您可能应该在Google Scholar上阅读关于mTCP和mUDP、移动VPN、移动TLS、无线TLS等的文章

加密不是你的问题。快速恢复将是你的问题


我同意重新发明轮子是不明智的,但我不确定HTTPS是否能在恶劣的网络条件下正常工作

好吧,就像乔恩·本特利博士说的:如果它不一定是正确的,我可以让它像你希望的那样快。您可能应该坚持使用SSL/TLS,在有缺陷的地方加强它,然后在密码套件中选择加快它的速度


如果HTTPS能够在恶劣的网络条件下正常工作,这通常是移动应用程序所面临的

手机在实践中并不是那么糟糕。对于断开连接,你无能为力。如果漫游时没有传输IP,您将无能为力。而且,对于设备的
ConnectionManager
,即使您知道自己没有覆盖范围,您也无法声称
写入成功

你所能做的就是确保快速恢复

也许您应该研究UDP和DTL


[HTTPS]真的适合HTTP REST API吗?HTTP REST API速度快,有效负载小

见本特利的名言


不要使用那个该死的浏览器安全模型。这是一种诅咒。(当然,除非您的模型中可以接受Diginotar和Trustwave类故障)。

我做了一个测试,以比较HTTP和HTTPS在“典型”网络条件下的性能:

  • 将3G网络与android手机配合使用
  • 在家测试,然后在办公室测试,包括步行、火车和公共汽车
  • 在每一轮测试中,交替使用http和https获取700字节的json字符串
测试结果: HTTP调用:2138次成功,13次失败,平均获取时间:492毫秒 HTTPS呼叫:成功1957次,失败5次,平均获取时间:778毫秒

测试结果显示,要获取较小的有效负载: 1.HTTPS和HTTP一样稳定 2.主要缺点是延迟,比HTTP慢58%

我认为这是可以接受的,所以我正在考虑转向HTTPS

毕竟,尽管发明一个轮子并不困难,但要发明一个足够好的轮子并不容易,正如@jww的评论

我将继续进行另一个测试,看看HTTPS在更大负载下的性能如何


谢谢大家。

关于重新认证/密钥建立,是否存在特定问题?还是使用TCP?创建协议是一项艰巨的工作,我建议您在发明wheel之前尝试TLS。HTTPS(实际上是SSL)包含一种称为会话恢复的功能,它避免了对每个连接进行昂贵的公钥操作。他们已经优化了您担心的问题。正如owlstead所建议的,不要对性能进行假设,而是尝试一下,看看。@owlstead“重新发明轮子”并不像我想象的那么难