假设我有一个包含机密信息的文本文件。我想通过网站上设置的 sftp 将其从美国设施传输到法国设施。
文件传输安全吗?
答案1
来自维基百科文章:SSH 文件传输协议
该协议本身不提供身份验证和安全性;它期望底层协议能够确保这一点。SFTP 最常用作 SSH 协议版本 2 实现的子系统,由同一工作组设计。但是,可以通过 SSH-1(一些实现支持这一点)或其他数据流运行它。通过 SSH-1 运行 SFTP 服务器与平台无关,因为 SSH-1 不支持子系统的概念。想要连接到 SSH-1 服务器的 SFTP 客户端需要知道服务器端 SFTP 服务器二进制文件的路径。
所以这实际上取决于您的设置方式。
如果您有兴趣,请阅读整篇文章。
答案2
正如 Davide Piras 指出的那样,SFTP 或更准确地说是底层 SSH 协议能非常安全。
但如果我理解正确的话,您希望使用某种基于 Web 的 SFTP 客户端。这意味着您还必须保护客户端和用于传输文件的网站之间的连接。
你不应该试图确保传输安全(无论如何你都应该这样做),而应该加密数据本身(例如使用 PGP 或基努),传输该加密文件并最终在目标系统上解密。
答案3
尽管 SSL 和 TLS 之间存在差异,导致它们无法相互操作,但就安全性而言,它们通常被认为是平等的。主要区别在于,虽然 SSL 连接以安全性开始,然后直接进行安全通信,但 TLS 连接首先以不安全的“hello”开始,然后仅当客户端和服务器之间的握手成功后才切换到安全通信。如果 TLS 握手因任何原因失败,则永远不会创建连接。
如果你使用 Windows(就像我一样),那么在这种情况下,你可能只需要一个支持 SFTP 的非 TLS 服务器(基于 SSH),而不是 FTPS 服务器(例如 FileZilla),例如空 FTP 服务器或者我使用的方法:带有 Tunnelier 客户端的 WinSSHD。
答案4
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Security.Cryptography;
namespace Encryption
{
class Program
{
static void Main(string[] args)
{
EncryptFile(@"C:\a.txt", @"C:\b.txt","password");
DecryptFile(@"C:\b.txt", @"C:\decrypted.txt",@"password");
}
public static void EncryptFile(string inputFile, string outputFile,string password)
{
try
{
UnicodeEncoding UE = new UnicodeEncoding();
byte[] key = UE.GetBytes(password);
string cryptFile = outputFile;
FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create);
RijndaelManaged RMCrypto = new RijndaelManaged();
CryptoStream cs = new CryptoStream(fsCrypt,
RMCrypto.CreateEncryptor(key, key),
CryptoStreamMode.Write);
FileStream fsIn = new FileStream(inputFile, FileMode.Open);
int data;
while ((data = fsIn.ReadByte()) != -1)
{
cs.WriteByte((byte)data);
}
fsIn.Close();
cs.Close();
fsCrypt.Close();
}
catch(Exception e)
{
Console.WriteLine(e);
}
}
public static void DecryptFile(string inputFile, string outputFile,string password)
{
{
UnicodeEncoding UE = new UnicodeEncoding();
byte[] key = UE.GetBytes(password);
FileStream fsCrypt = new FileStream(inputFile, FileMode.Open);
RijndaelManaged RMCrypto = new RijndaelManaged();
CryptoStream cs = new CryptoStream(fsCrypt,
RMCrypto.CreateDecryptor(key, key),
CryptoStreamMode.Read);
FileStream fsOut = new FileStream(outputFile, FileMode.Create);
int data;
while ((data = cs.ReadByte()) != -1)
fsOut.WriteByte((byte)data);
fsOut.Close();
cs.Close();
fsCrypt.Close();
}
}
}
}