服务器并不知道FTP账号密码是什么,它只负责读取存储好的账号信息,然后用加密算法对提交上来的密码做比对,匹配通过就放行,匹配失败就拒绝。整个过程不涉及“理解”,纯粹是文件读取和字符串校验,你输入的密码在服务器眼里只是一串哈希值,而不是明文,这篇文章要讲清楚的,就是这串哈希值从哪来、存在哪、服务器怎么用它认人,以及你在遇到“FTP账号密码是什么”这个问题时,到底该去哪里找答案。
FTP账号密码在服务器上的两种存储方式
FTP服务本身不是一个独立王国,它的账号体系要么挂在操作系统名下,要么自己另立门户,这两种方式决定了密码的存放位置和校验逻辑完全不同。
系统用户验证:密码藏在系统账户数据库里
多数Linux服务器默认的FTP服务软件是vsftpd,它的默认配置采用系统用户验证,也就是说,你创建FTP账号的时候,实际上是在创建一个Linux系统用户,密码存在系统的账号文件里:
- 用户名的存放位置是 /etc/passwd
- 密码哈希的存放位置是 /etc/shadow
这里有一个关键点,/etc/passwd对所有人可读,但里面没有密码,只有一个“x”占位符,真正的密码哈希在/etc/shadow里,只有root用户能读取,你用cat /etc/shadow命令查看时,会看到类似这样的一行:
ftpuser:$6$randomSalt$HashedPasswordString:19000:0:99999:7:::
其中$6$代表SHA-512加密算法,后面跟着的是盐值和哈希结果,服务器校验密码时,做的事情是把你输入的密码用同样的盐值重新计算哈希,然后比对两个哈希字符串是否一致,哈希算法是单向的,所以服务器“知道”的是哈希值,不是密码本身。
虚拟用户验证:密码存在FTP服务自己的配置文件里
另一种常见方式是虚拟用户模式,很多Windows服务器上的Serv-U,以及Linux上的Pure-FTPd,都支持这种模式,账号和密码不进入系统用户表,而是单独存放在:
- 文本文件,比如/etc/vsftpd/virtual_users.txt
- 数据库表,比如MySQL或SQLite里的某张用户表
以vsftpd的虚拟用户配置为例,文本文件里每一行是一个用户名,下一行是明文密码。
ftpuser1
MyPassword123
ftpuser2
AnotherPass456
但注意,这只是“源头文件”,vsftpd读取这个文件后会用db_load工具把它转换成Berkeley DB格式的数据库文件,实际运行时,服务器查的是转换后的.db文件,不是直接读文本,文本文件更新后必须重新执行转换命令才能生效。
服务器到底在哪一步“检查”密码
了解存储位置后,还要搞清楚校验发生在哪个环节,FTP连接建立后,客户端发送USER命令,服务器在本地查找这个用户名,然后返回“需要密码”的响应,接着客户端发送PASS命令,服务器开始执行校验,这个过程中有几个关键动作:
- 查找用户记录,如果用户名不存在,直接返回530错误。
- 提取密码哈希,从/etc/shadow或虚拟用户数据库里取出对应记录。
- 计算哈希值,用存储的盐值和算法,对客户端提交的密码做哈希运算。
- 字符串比对,两个哈希完全一致则通过,否则拒绝。
Linux系统上可以用getent passwd ftpuser命令验证用户是否存在,用getent shadow ftpuser查看密码策略字段,但实际操作中,普通用户无法执行后一条命令,需要sudo权限,这也是很多新手不知道“服务器怎么知道ftp账号密码”的原因他们看不到shadow文件,就以为密码不存在。
服务器密码和FTP密码的区别
容易混淆的一个点是,服务器SSH登录密码和FTP密码在系统用户模式下是同一个密码,因为FTP校验的就是系统用户的密码哈希,修改了SSH密码,FTP密码跟着变,但在虚拟用户模式下,FTP密码独立于系统密码,互不影响。
判断你的服务器用的是哪种模式,有一个简单的排查路径:
- 查看vsftpd配置文件
/etc/vsftpd/vsftpd.conf,如果里面有guest_enable=YES,说明启用了虚拟用户。 - 如果没有这一行,默认就是系统用户模式。
- Windows服务器上,如果用的是IIS自带的FTP服务,账号通常在“计算机管理-本地用户和组”里,属于系统用户模式。
-
如果用的是Serv-U,账号存在Serv-U自己的数据库里,属于虚拟用户模式。
找回或重置FTP密码的实操路径
搞清楚服务器怎么验证密码之后,实际运维中遇到的问题是“我忘了密码怎么办”,这里分场景给出可操作的步骤。
知道服务器root权限,但忘了FTP密码
直接重置密码即可,不需要找回旧密码,以Linux系统用户模式为例:
sudo passwd ftpuser
系统会提示输入新密码并确认,命令执行后,/etc/shadow文件中的哈希值会被更新,旧密码立即失效,如果是虚拟用户模式,需要编辑虚拟用户文本文件,然后重新生成数据库:
vi /etc/vsftpd/virtual_users.txt
db_load -T -t hash -f /etc/vsftpd/virtual_users.txt /etc/vsftpd/virtual_users.db
systemctl restart vsftpd
只有FTP权限,没有服务器SSH权限
这种情况无法自行重置密码,只能联系服务器管理员,但有一个思路值得尝试:检查FTP客户端软件是否保存了密码,FileZilla等客户端默认保存密码,在“站点管理器”里可以查看已保存的密码明文,这不算“破解”,只是找回自己存储的凭据。
用的是宝塔面板等控制面板
宝塔面板的FTP账号密码在“FTP”菜单里管理,面板存储密码的方式是加密后写入面板数据库,但FTP服务本身用的是Pure-FTPd的虚拟用户机制,在面板中直接修改密码即可,无需手动操作配置文件,很多站长遇到的“服务器ftp账号密码是什么”问题,其实只需要登录宝塔面板看一眼就能解决,这个路径比命令行要快得多。
FTP协议本身对密码的保护程度
FTP协议诞生于1971年,当时的网络环境没有加密需求,基础FTP协议中,用户名和密码以明文传输,也就是说,在客户端到服务器的网络链路上,抓包工具可以直接看到密码内容,服务器收到的就是明文字符串,然后自己在本地做哈希比对。
这也是为什么行业共识强烈建议使用FTPS(FTP over SSL/TLS)或SFTP(SSH File Transfer Protocol)替代传统FTP,业内专家指出,明文传输的FTP密码在公网环境下被截获的风险相当大,如果你用的是Windows服务器上的IIS FTP,开启SSL只需要在“SSL设置”里选择“允许SSL连接”并指定证书即可,Linux上的vsftpd开启TLS则需要在配置文件中添加:
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
配置后重启服务,密码传输就会被加密,此时服务器校验密码的逻辑不变,但网络上抓到的只是密文,安全性提升一个档次。
服务器怎么知道密码是不是正确的
最后把整个流程做一个闭环梳理,当你输入用户名和密码点击登录时,服务器的动作是这样的:
- FTP服务进程接收到USER和PASS命令。
- 服务进程调用PAM(可插拔认证模块)或直接读取用户数据库。
- PAM模块从/etc/shadow读取对应账户的密码哈希和加密参数。
- 服务端用相同参数加密你输入的密码,生成一个新的哈希。
- 两个哈希比较,相等则返回230登录成功,不等则返回530登录失败。
需要注意的是,整个比较过程在服务器内存中完成,不涉及网络传输,所以就算FTP服务日志记录了登录尝试,也不会记录你的密码明文,日志里只有时间戳、IP地址、用户名和登录结果。
常见问题解答
FTP账号密码是什么格式的
没有固定格式,取决于服务器端的密码策略,Linux系统用户模式受/etc/login.defs中的PASS_MAX_DAYS等策略影响,但密码长度和复杂度由root用户设置时决定,虚拟用户模式通常没有复杂度强制要求,密码以哈希形式存储,所以长度通常为几十到上百个字符的哈希串,但你自己设置的密码本身可以是任意长度。
怎么查看服务器上的FTP账号列表
Linux系统用户模式下,执行getent passwd | grep home能列出所有有家目录的用户,虚拟用户模式下,直接查看虚拟用户配置文件,Windows服务器上,在“计算机管理-本地用户和组-用户”里查看,有面板的话,直接在面板的FTP管理页面查看,这是最直观的方式。
FTP密码和数据库密码是不是同一个
不是,数据库密码由数据库服务自己管理,比如MySQL的user表存储认证信息,与FTP服务无关,只有当应用程序连接数据库时才会用到数据库密码,FTP密码只负责FTP服务的登录认证,两者是完全独立的体系。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/599201.html




