我必须选择一个安全的文件传输协议,在预启动系统中实现。我可以访问具有基本网络功能(IP、TCP、UDP 等)的库。我可能还可以访问 OpenSSL 库。
我需要知道哪个是最容易实现的,以防我有可用的 OpenSSL 库,如果我没有。我没有 SSH 客户端,所以在使用 SFTP 的情况下我必须实现它。
最后,我真的很想有人能给我一个合理的声明,说明 SSH 或 SSL/TLS 之间更容易实现(更简单是指更容易实现更短的时间)。
我必须选择一个安全的文件传输协议,在预启动系统中实现。我可以访问具有基本网络功能(IP、TCP、UDP 等)的库。我可能还可以访问 OpenSSL 库。
我需要知道哪个是最容易实现的,以防我有可用的 OpenSSL 库,如果我没有。我没有 SSH 客户端,所以在使用 SFTP 的情况下我必须实现它。
最后,我真的很想有人能给我一个合理的声明,说明 SSH 或 SSL/TLS 之间更容易实现(更简单是指更容易实现更短的时间)。
如果您有 OpenSSL,则使用 SSL/TLS:最容易实现的协议是已经实现的协议。SSL 只是提供了一个原始隧道,因此您必须包含某种管理协议来组织实际的“文件传输”,例如 HTTP。SSL 中的 HTTP 被称为 HTTPS:这是标准的,因此指定协议的艰苦工作已经完成。
如果没有 OpenSSL,我个人仍然会推荐 SSL/TLS,原因如下:我已经做到了(嵌入式系统的 SSL 客户端和服务器,每个都适合不到 20 kB 的代码)。所以我知道这是可行的。此外,还有其他针对小型系统的 SSL/TLS 库,例如CyaSSL或axTLS。
重新实现 SSH 协议应该不会比重新实现 SSL 困难得多,但 SSH 规范更大(它从描述架构的RFC 4251开始,实际协议分布在几个后续 RFC 中;另一方面,SSL/TLS适合单个RFC 5246)。这显然是一种不太客观的协议选择方式,但也并非完全没有必要。
对于 SSL/TLS,我建议如下:
使用TLS 1.2并且不要打扰以前的版本(您控制客户端和服务器,因此您可以强制执行特定版本)。TLS 1.2 只需要实现一个哈希函数,而之前的版本需要 MD5 和 SHA-1。
使用单个密码套件(例如TLS_RSA_WITH_AES_128_CBC_SHA256)。这大大简化了事情,并允许您对块大小或 MAC 长度等内容进行硬编码。
使用 RSA 密钥交换并将您的系统安排为“客户端”:这允许它仅在加密模式下使用 RSA,这比解密更容易实现。此外,客户端不需要存储非对称私钥,这很好,因为安全密钥存储很困难。
不要尝试解码证书。在普通 SSL/TLS 中,服务器将其公钥作为 X.509 证书链的一部分发送给客户端;客户端应该根据硬编码的公钥验证链。只需切断中间人,并在客户端对服务器公钥进行硬编码(X.509 证书链验证可以完成——即使是 6 kB 的代码——但这非常棘手)。
无论哪种方式,如果手头没有加密库,您将不得不重新实现一些基本算法,这并不容易(尤其是如果您想避免侧信道攻击,这始终是嵌入式系统的一个问题)。您还需要访问加密安全的随机数源:在预引导系统上,这可能会很困难。但这对于安全性极为重要。
我会投票给scp。非常简单、安全,并且有很多自定义选项。sftp 在同一条船上,除了稍微复杂一些。