FTPS (FTP over SSL) vs. SFTP (SSH 文件传输协议): 我们如何做出选择
第一个RFC的FTP协议发布通过网络使用FTP协议(由RFC 959或更高版本)的文件传输始于1980年,FTP提供上传,下载和删除文件,创建和删除目录,读取目录内容的功能。虽然FTP是非常受欢迎的,它有一些缺点,使其更难使用。主要的缺点是缺乏目录列表的统一格式(这个问题已经通过引入MLST命令部分解决,但是一些服务器不支持)和辅助连接(DATA连接)的存在。FTP中的安全性通过对RFC 2228中定义的信道加密采用SSL / TLS协议来提供。FTP的安全版本称为FTPS。
在UNIX系统中,另一种安全标准有所提升。它是SSH协议家族的一员,SSH的主要功能是保护远程shell访问UNIX系统。后来SSH扩展了文件传输协议 - 第一个是SCP(SSH 1.x),然后是SFTP(SSH2)。版本1中的SSH协议已经过时了,而且不安全,我们一般不推荐使用。 因此,SCP不再被使用,然后SFTP却日益流行。
“SFTP”缩写经常被误解是FTP某种安全的类型,人们通常认为是FTPS。另一个(类似的)误解是SFTP被认为是某种基于SSL的FTP。 而实际上SFTP是“SSH文件传输协议”的缩写。这不是基于SSL的FTP,而是基于SSH的FTP(这在技术上也是可能的,但是非常少见)。
SFTP是一种二进制协议,其最新版本在RFC 4253中被标准化。所有命令(请求)被打包为二进制消息,并发送到服务器,服务器使用二进制回复包进行回复。在之后的版本中,SFTP被扩展为不仅仅提供文件上传/下载操作,还提供一些文件系统操作,例如文件锁定,符号链接创建等。
FTPS和SFTP都使用非对称算法(RSA,DSA),对称算法(DES / 3DES,AES,Twhofish等)和密钥交换算法的组合。对于验证FTPS(或更准确地说,FTP下的SSL / TLS协议)使用X.509证书,而SFTP(SSH协议)使用SSH密钥。
X.509证书包括公钥和有关证书所有者的某些信息。此信息允许另一方验证证书本身的完整性和证书所有者的真实性。验证可以通过计算机和在一定程度上由人来完成。 X.509证书具有关联的私钥,出于安全原因,通常与证书分开存储。
SSH密钥只包含公钥(相关的私钥是单独存储的)。它不包含有关密钥所有者的任何信息。 同样也不包含允许可靠地验证完整性和真实性的信息。 一些SSH软件实现使用X.509证书进行身份验证,但实际上它们不验证整个证书链 - 只使用公钥(这使得此类身份验证不完整,类似于SSH密钥身份验证)。
以下是两个协议的优缺点的简要列表:
FTPS
优点:
- 广为人知并使用
 - 通信可以由人阅读和理解
 - 提供了服务器到服务器文件传输的服务
 - SSL / TLS具有良好的身份验证机制(X.509证书功能)
 - 在许多互联网通信框架中都支持内置FTP与SSL / TLS。
 
缺点:
- 没有统一的目录列表格式
 - 需要辅助数据通道,这使其难以在防火墙后使用
 - 没有为文件名定义标准字符集(编码)
 - 并非所有FTP服务器都支持SSL / TLS
 - 没有标准的方式来获取和更改文件和目录属性
 
SFTP
优点:
- 有良好的标准背景,在操作方面具有严格的定义
 - 只有一个连接(不需要DATA连接)
 - 连接始终保持安全
 - 统一的目录列表格式
 - 协议包括用于权限和属性操作,文件锁定和更多功能的操作
 
缺点:
- 通信是二进制的,可读性差
 - SSH密钥更难以管理和验证
 - 标准将某些事物定义为可选或推荐的,这导致某些兼容性问题
 - 没有服务器到服务器副本以及递归目录删除操作
 - 在VCL和.NET框架中不支持内置的SSH / SFTP
 
如何做出选择
通常,答案取决于您的目标和要求。 一般来说,SFTP在技术上优于FTPS。 当然,实现对两个协议的支持是一个好主意,但是它们在概念,支持的命令和许多其他方面是不同的。
当您具有需要从个人设备(智能手机,PDA等)访问的服务器或具有FTP支持但没有SSH / SFTP客户端的某些特定操作系统时,最好使用FTPS。 如果您正在构建自定义安全解决方案,SFTP可能是更好的选择。
对于客户端,需求由您计划连接的服务器定义。 当连接到Internet服务器时,SFTP更受欢迎,因为它默认由Linux和UNIX服务器支持。
对于私有主机到主机传输,您可以使用SFTP和FTPS。 对于FTPS,您需要搜索一个免费的FTPS客户端和服务器软件或购买商业许可证。 对于SFTP支持,您可以安装OpenSSH软件包,它提供免费的客户端和服务器软件。 对于商业用途,我们建议使用Bitvise SSH服务器。
开发工具
如果您是软件开发人员,并且需要在应用程序中实现文件传输功能,则您将搜索组件以执行该作业。
.NET中,对.NET Framework中的FTPS有内置支持(请参阅FtpWebRequest类)。 但是这个类的功能受到严格限制,特别是在SSL / TLS控制方面。
.NET Framework不包括对SSH或SFTP的任何支持。
VCL中,您可以选择提供FTP功能的免费组件和库。 当您向他们添加OpenSSL时,您可以免费获取FTPS。 如果您不想处理OpenSSL DLL,您可以使用一个商业上可用的库来支持SSL和FTPS。 再次提醒,没有免费的SFTP组件可用于.NET。
Java中,FTPS和SFTP客户端存在几个不受支持和错误。
对于所有提到的平台和技术,欢迎您下载SFTP或FTPS组件(都是SecureBlackbox套件的一部分),并自行测试:
- .NET时,Windows RT,Silverlight,.NET CF,Windows Phone,Android应用程序 - 点击这里
 - Java或Android应用程序 - 点击这里
 - Delphi,C ++ Builder,Free Pascal(Windows,Mac OS,Linux)应用程序 - 点击这里
 - C ++(Linux,MacOS,iOS)应用程序 - 点击这里
 
FTPS (FTP over SSL) vs. SFTP (SSH 文件传输协议): 我们如何做出选择的更多相关文章
- linux之FTP服务搭建  ( ftp文件传输协议 VSFTPd虚拟用户)
		
FTP服务搭建 配置实验之前关闭防火墙 iptables -F iptables -X iptables -Z systemctl stop firewalld setenforce 0 1.ftp简 ...
 - ftp    (文件传输协议)
		
ftp (文件传输协议) 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议” ...
 - 【RL-TCPnet网络教程】第35章	 FTP文件传输协议基础知识
		
第35章 FTP文件传输协议基础知识 本章节为大家讲解FTP(File Transfer Protocol,文件传输协议)的基础知识,方便后面章节的实战操作. (本章的知识点主要整理自网络) ...
 - 【计算机网络】2.3 文件传输协议:FTP
		
第二章第三节 文件传输协议:FTP 在一个典型的FTP(File Transfer Protocol,文件传输协议)会话中,用户坐在一台主机(本地主机)前面,向一台远程主机传输(或接收来自远程主机的) ...
 - Linux菜鸟成长日记 ( Linux 下的 ftp 文件传输协议 )
		
https://blog.csdn.net/buster_zr/article/details/80244542 FTP FTP 是 File Transfer Protocol (文件传输协议)的英 ...
 - 文件传输协议FTP、SFTP和SCP
		
网络通信协议分层 应用层: HTTP(Hypertext Transfer Protocol 超文本传输协议,显示网页) DNS(Domain Name System) FTP(File Transf ...
 - 【传输文件】文件传输协议FTP、SFTP和SCP
		
网络通信协议分层 应用层: HTTP(Hypertext Transfer Protocol 超文本传输协议,显示网页) DNS(Domain Name System) FTP(File Transf ...
 - 【FTP】FTP(文件传输协议)工作原理(SFTP)
		
目前在网络上,如果你想把文件和其他人共享.最方便的办法莫过于将文件放FTP服务器上,然后其他人通过FTP客户端程序来下载所需要的文件. 1.FTP架构 如同其他的很多通讯协议,FTP通讯协议也采用客户 ...
 - 文件传输协议:FTP、TFTP、SFTP有什么区别?
		
一个执着于技术的公众号 FTP 提供一种在服务器和客户机之间上传和下载文件的有效方式:是基于TCP的传输,FTP采用双TCP连接方式:支持授权与认证机制,提供目录列表功能. ---控制连接使用TCP端 ...
 
随机推荐
- 基于STM32的USB枚举过程学习笔记
			
源:基于STM32的USB枚举过程学习笔记 基于STM32的USB枚举过程学习笔记(一) 基于STM32的USB枚举过程学习笔记(二) 基于STM32的USB枚举过程学习笔记(三) 基于STM32的U ...
 - JS input file 转base64  JS图片预览
			
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
 - hisi出的H264码流结构
			
hisi出的H264码流结构: IDR帧结构如下: 开始码 + nalu + I帧 + 开始码 + nalu + SPS + 开始码 + nalu + PPS + ...
 - Java编程思想非主流知识点
			
1. Java中的多态性理解(注意与C++区分) Java中除了static方法和final方法(private方法本质上属于final方法,因为不能被子类访问)之外,其它所有的方法都是动态绑定,这意 ...
 - php __set()和__get()函数
			
<?php /* 总结: 1. 从一个难以访问的属性读取数据的时候 __get() 方法被调用 2. 向一个难以访问的属性赋值的时候 __set() 方法被调用 3. 难以访问包括:(1)私有属 ...
 - Python3基础 使用for循环 删除一个列表中的重复项
			
镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...
 - [转python 父类可以调用子类的方法
			
问题描述:我也是在读500 Line 里满的DBDB 的代码时发现的,python的父类可以调用子类的方法,这跟平常习惯的理解方式很不一样,所以就查了下原因,记录如下: 1.现象:最近使用到了So ...
 - javascript中的元素包含判断
			
在实际开发中,很多时候需要知道某个节点是不是另一个节点的后代.很多浏览器提供了contains方法,如: console.log(document.documentElement.contains(d ...
 - TSP问题(旅行商问题)[分支限界法]
			
问题: 旅行商从 a 开始周游下图所有的城市一次,然后回到 a,城市之间的旅行代价在图中标明. 请选择一个最优的行走顺序使得周游所有城市的代价最小. 思路: 随便怎么周游,对于一个城市来说,一定有一条 ...
 - file_get_contents无法请求https连接的解决方法
			
PHP.ini默认配置下,用file_get_contents读取https的链接,就会如下错误: Warning: fopen() [function.fopen]: Unable to find ...