第一个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套件的一部分),并自行测试:

  1. .NET时,Windows RT,Silverlight,.NET CF,Windows Phone,Android应用程序 - 点击这里
  2. Java或Android应用程序 - 点击这里
  3. Delphi,C ++ Builder,Free Pascal(Windows,Mac OS,Linux)应用程序 - 点击这里
  4. C ++(Linux,MacOS,iOS)应用程序 - 点击这里

FTPS (FTP over SSL) vs. SFTP (SSH 文件传输协议): 我们如何做出选择的更多相关文章

  1. linux之FTP服务搭建 ( ftp文件传输协议 VSFTPd虚拟用户)

    FTP服务搭建 配置实验之前关闭防火墙 iptables -F iptables -X iptables -Z systemctl stop firewalld setenforce 0 1.ftp简 ...

  2. ftp (文件传输协议)

    ftp (文件传输协议) 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议” ...

  3. 【RL-TCPnet网络教程】第35章 FTP文件传输协议基础知识

    第35章      FTP文件传输协议基础知识 本章节为大家讲解FTP(File Transfer Protocol,文件传输协议)的基础知识,方便后面章节的实战操作. (本章的知识点主要整理自网络) ...

  4. 【计算机网络】2.3 文件传输协议:FTP

    第二章第三节 文件传输协议:FTP 在一个典型的FTP(File Transfer Protocol,文件传输协议)会话中,用户坐在一台主机(本地主机)前面,向一台远程主机传输(或接收来自远程主机的) ...

  5. Linux菜鸟成长日记 ( Linux 下的 ftp 文件传输协议 )

    https://blog.csdn.net/buster_zr/article/details/80244542 FTP FTP 是 File Transfer Protocol (文件传输协议)的英 ...

  6. 文件传输协议FTP、SFTP和SCP

    网络通信协议分层 应用层: HTTP(Hypertext Transfer Protocol 超文本传输协议,显示网页) DNS(Domain Name System) FTP(File Transf ...

  7. 【传输文件】文件传输协议FTP、SFTP和SCP

    网络通信协议分层 应用层: HTTP(Hypertext Transfer Protocol 超文本传输协议,显示网页) DNS(Domain Name System) FTP(File Transf ...

  8. 【FTP】FTP(文件传输协议)工作原理(SFTP)

    目前在网络上,如果你想把文件和其他人共享.最方便的办法莫过于将文件放FTP服务器上,然后其他人通过FTP客户端程序来下载所需要的文件. 1.FTP架构 如同其他的很多通讯协议,FTP通讯协议也采用客户 ...

  9. 文件传输协议:FTP、TFTP、SFTP有什么区别?

    一个执着于技术的公众号 FTP 提供一种在服务器和客户机之间上传和下载文件的有效方式:是基于TCP的传输,FTP采用双TCP连接方式:支持授权与认证机制,提供目录列表功能. ---控制连接使用TCP端 ...

随机推荐

  1. 【转】C/CPP之static

    静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见.用法1:函数内部声明 ...

  2. 【bug】java.lang.NoSuchMethodError: android.widget.TextView.setBackground

    安卓的背景色设置需要根据SDK的版本来分情况考虑: if (Build.VERSION.SDK_INT >= 16) { textView.setBackground(null); } else ...

  3. 如何使用python timeit模块使用实践

    其实平时使用测试应用运行时间的情况 细算一下还真的很少.很久没有做性能优化的工作,不管是cProfile还是timeit模块都已经生疏了很久没有使用,我在以前的文章里面有提到过cPfile的性能测试使 ...

  4. oracle存储过程学习---包的概念

    转自:http://www.iteye.com/topic/1111793 一.包的概念   类似于一个容器,能打包相应的Pl/SQL变量.常量.函数.过程.复合数据类型等元素到这个容器内.用来限制  ...

  5. Python模块学习:threading 多线程控制和处理

    Reference:http://python.jobbole.com/81546/ threading.Thread Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有 ...

  6. python 模块添加

    python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径.下面将具体介绍几种常用情况: (1)主程序与模块程序在同一目录下: 如下面程序结构:`-- src  ...

  7. 利用python 实现微信公众号群发图片与文本消息功能

    在微信公众号开发中,使用api都要附加access_token内容.因此,首先需要获取access_token.如下: #获取微信access_token def get_token(): paylo ...

  8. Arcgis js API使用wmts方式加载GeoWebCache中的切片地图(转载)

    使用GeoWebCache的主要目的是其独立安装版能够发布arcgis的切片.我们知道,使用openlayer是调用geoserver最方便的方法,那么在发布完arcgis的切片后,怎么用arcgis ...

  9. 一点养老APP模式定制系统平台源码

    一点养老APP模式定制系统开发:136.1013.1824电/微:搭建一点养老APP模式定制系统平台.专注于为企业和商家客户提供基于腾讯微信公众平台系统程序和APP等开发服务,中国养老金融50人论坛2 ...

  10. pureMVC简单示例及其原理讲解三(View层)

    本篇说的是View层,即视图层,在本示例中包括两个部分:MXML文件,即可视控件:Mediator. 可视控件 可视控件由UserForm.mxml(图1)和UserList.mxml(图2)两个文件 ...