V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Admstor
V2EX  ›  SSH

我不理解几乎所有 SSH 加固都提到配置公钥

  •  
  •   Admstor · 8 小时 45 分钟前 · 1195 次点击
    我理解公钥私钥只是一个更加复杂的密码

    倘若我本身密码就是 16 位以上大小写英文数字符号混合,并且每个服务器密码均随机生成不一样
    并且我开启了 auto-ban 之类的服务,防止穷举猜测密码

    那是否可以认为安全性是接近的
    特别如果是私钥泄露意味你几乎所有服务器等于密码泄露,难道是每个服务器私钥都不一样?
    第 1 条附言  ·  7 小时 24 分钟前
    我发现一些 V2er 总是想当然的嘲讽 16 位密码太弱,但是实际上只计算大小写英文+数字,组合就有 62 的 16 次方,这本身就是天文数字,私钥确实在密码复杂度上更加夸张,但是无论哪一个几乎都可以说在现实中不具备被暴力破解的意义,更多的是出现在密码更加容易泄露,私钥交换过程更安全这样的因素上。

    那么到底为何更安全,也没几个人说得清楚
    47 条回复    2026-02-04 05:56:15 +08:00
    wonderfulcxm
        1
    wonderfulcxm  
       8 小时 37 分钟前 via iPhone   ❤️ 1
    你观察得很仔细,这是个好问题👍
    jhytxy
        2
    jhytxy  
       8 小时 32 分钟前
    安全性好像并不接近

    但是你的也足够安全,比如你的要破 100 年,私钥的得破 1000 年

    你找 ai 问问密码学的问题吧

    password 和 key
    中文都叫密码,但是意义不同
    laikicka
        3
    laikicka  
       8 小时 30 分钟前
    你不懂 SSH 也不懂密码学 是这样的
    zooo
        4
    zooo  
       8 小时 29 分钟前
    能在 v 站看到这个帖子我也是开了眼了
    yinmin
        5
    yinmin  
       8 小时 26 分钟前
    私钥文件是可以加密码保护的
    zhy0216
        6
    zhy0216  
       8 小时 25 分钟前 via Android
    好处是本地一个私钥 对多服务器同一个公钥
    万一某个服务器被黑 本地的私钥不用换
    adoal
        7
    adoal  
       8 小时 23 分钟前
    root 帐户用了超级复杂口令
    你自己的登录帐户用了超级复杂口令
    然后你同事那个能 sudo 的帐户用了 admin123
    你配置了口令复杂度的 pam 策略
    然后被所有其它同事一致骂
    xiangyuecn
        8
    xiangyuecn  
       8 小时 16 分钟前
    私钥的“私”,意思是只有你有这个密钥,不会发送出去

    服务器用你的公钥加密的数据只有你能解密,就算是明文传输,也是安全的,任何人截获数据也没用 解密不了,中间人也不好使
    SAFEluren
        9
    SAFEluren  
       8 小时 14 分钟前
    为啥会觉得 16 位混合密码能打得过 rsa or ed25519 呢?那密码就不能泄漏了?
    另外一个人不止可以有一个私钥的,你要是想,当然可以给不同等级的服务器用不同的私钥
    totoro625
        10
    totoro625  
       8 小时 10 分钟前   ❤️ 1
    安全性是接近的 ✓
    但是时间线拉长,还是有点差异的
    RSA (4096 位)> Ed25519 > RSA (2048 位)>随机密码

    能理解你不喜欢使用公钥,但是面向所有人的教程:配置公钥,就完事了
    只需要存储一个小文件就 ok ,不需要存储一个特别的“16 位以上大小写英文数字符号混合”
    一个是自己都会记错
    二是会顺手发给微信
    三是人会撒谎
    四是人会犯懒
    wonderfulcxm
        11
    wonderfulcxm  
       8 小时 6 分钟前 via iPhone
    简单地说,Ed25519 密钥拥有 256 bits 的安全性。在数学层面上,破解密钥的难度比破解 16 位密码高出天文数字级。
    wonderfulcxm
        12
    wonderfulcxm  
       7 小时 54 分钟前 via iPhone   ❤️ 1
    主要黑客也要衡量成本,破解难度高就知难而退了,而且公钥挑战失败的错误信息非常明显,不如去祸害别的密码登录的,btw ,fail2ban 这种防不了分布式攻击。如果有几万个 ip ,每个 IP 试一次,也很难将其封锁。
    loading
        13
    loading  
       7 小时 51 分钟前 via Android
    建议先了解一下 PGP ,然后在了解一下公钥交换后,最后看一下你自己提的问题。
    NonResistance
        14
    NonResistance  
       7 小时 49 分钟前 via iPhone
    mercury233
        15
    mercury233  
       7 小时 49 分钟前
    多个复杂密码容易变成防自己,如果在电脑上或者密码管理器中保存密码,泄露风险不比泄露私钥低多少
    nomagick
        16
    nomagick  
       7 小时 45 分钟前
    关键词 Diffie–Hellman key exchange
    lscho
        17
    lscho  
       7 小时 42 分钟前 via Android
    建议粗略了解一下密码学。。。。在数学层面,安全性是天文数字的差距。
    Admstor
        18
    Admstor  
    OP
       7 小时 34 分钟前
    @adoal 你这个似乎也防不住同事泄露私钥吧
    phrack
        19
    phrack  
       7 小时 32 分钟前   ❤️ 1
    密码登陆的话是密码要发送到 ssh 服务器的,不会像常见的 web 服务那样发送 hash ,可以用 pam 模块拦截记录

    这个知识点估计只有极少数人知道,一般用来后入侵横移

    随机密码你总是要复制粘贴的,剪贴板的内容很容易不小心粘贴到错误的地方,监控剪贴板也比较容易
    Admstor
        20
    Admstor  
    OP
       7 小时 28 分钟前
    @wonderfulcxm 你这个分布式攻击确实,不过 16 位的混合密码,也存在 62 的 16 次方,这个数字也已经是天文数字了,我算了用 10W 设备每秒 100 次尝试,也需要 75 万年,这放到现实其实就是足够安全了吧,更何况这种尝试,我怕是服务器先被流量撑爆
    restkhz
        21
    restkhz  
       7 小时 24 分钟前
    主要是密码管理问题

    比如,服务器有 root 账户,你们几个人一起维护用同一个密码,一旦有人离职这密码就要换掉。但是你现在只需要删掉他公钥就行。就不要说还有那些能 sudo 账户可能还有弱密码的问题...反正直接禁用密码用公钥就没这些事了。

    另外你描述的 16 位密码大概是等效 log2(94)*16 ,105bit 。还是不够长。你要是有 20 位就能做到 128bit 了 XD

    问题是公钥认证模式中几乎不可能做暴力破解。登陆时你要先发你的公钥,你要不先偷到公钥,要不先猜那个巨长的公钥。公钥先猜对了,服务器这时候要你签名之前步骤里的信息,你这才有机会开始猜私钥...

    用密码服务器多了也要用密码管理器...不如用一个公钥私钥对直接解决大部分密码管理问题了。

    另外私钥也可以上密码的。
    artiga033
        22
    artiga033  
       7 小时 21 分钟前 via Android
    考虑实际的话,不管哪种方式要穷举完所有可能先耗尽的可能是网络资源...

    但是有一点是,脑子正常的攻击者遇到没开密码验证的服务器一般就直接放弃尝试了,否则可能会一直试
    Admstor
        23
    Admstor  
    OP
       7 小时 20 分钟前
    @restkhz 你提到的多用户情况确实存在,但这似乎也仅仅是便利性上而非安全性上,更换密码一样安全不是吗? sudo 同理,这已经超过本身讨论,16 位密码是不是足够安全这个范围。

    不论 105bit 还是 128bit 甚至 4096bit ,现实暴力破解的预期时间都可以说是遥遥无期
    Admstor
        24
    Admstor  
    OP
       7 小时 17 分钟前
    @artiga033 一直尝试绝大部分情况下也并不会导致网络阻塞,毕竟想阻塞网络不会用尝试 SSH 密码这种攻击方式。还是回到密码本身是否足够安全这样的范围里讨论吧
    wonderfulcxm
        25
    wonderfulcxm  
       7 小时 15 分钟前 via iPhone
    @Admstor 如果从负载的角度看,更应该关闭密码验证只启用密钥,每次密码验证服务器要进行一次复杂的哈希运算,这些还故意设计得很慢,需要消耗大量内存,而公钥验证速度极快,对内存要求也很低。
    01802
        26
    01802  
       7 小时 0 分钟前 via Android
    和密码是两种东西啊,记得三十年前老师专门讲公钥私钥在邮件加密里的作用。
    BenHunDun
        27
    BenHunDun  
       6 小时 55 分钟前
    @Admstor 公私钥本质就不是说类似做密码验证. 可能先了解一下对称加密, 非对称加密.
    像是你一直提到的是密码比对, 但是如果在传输不可信的时候. 他可能就会出问题, 类似中间人攻击.
    (叠个甲. 对安全这块个人也不是专业的) 上面的这些内容可以了解一下.
    adoal
        28
    adoal  
       6 小时 53 分钟前
    @Admstor 能防住用了 admin123 当口令还不觉得是问题的同事
    adoal
        29
    adoal  
       6 小时 52 分钟前
    @totoro625 对,OP 的想法太考验人性了
    BenHunDun
        30
    BenHunDun  
       6 小时 51 分钟前
    然后泄露凭证, 密码, 公私钥这类, 应该都不属于密码学和网络协议能够解决的范畴
    adoal
        31
    adoal  
       6 小时 46 分钟前
    算了,还是放弃吧、OP 说的对 o(╥﹏╥)o
    aarontian
        32
    aarontian  
       6 小时 46 分钟前
    私钥的永远不会离开你的电脑,由此可以避免中间人攻击,重放攻击,撞库攻击等(我觉得这是最主要优势)。密码简单的容易破解,复杂的你需要备份/复制粘贴,再敲键盘,每一步都会增加危险。

    私钥没有任何语义特征,密码通常有(如果你想记住),这是天然的不安全性。

    特殊情况下你的服务器被侵入,如果是密码加密,攻击者可以对 hash 进行离线脱机爆破,这个过程只需要简单的位运算—— 一块 RTX 4090 跑 SHA-256 的速度大约是 100 GH/s (10^{11} 次/秒)。而破解 ed25519 尝试一次的运算成本是哈希运算的数万倍。

    公共服务器的登陆管理就不说了。

    如果考虑未来的技术(量子计算),这个差距会发生反转:
    ​破解密码: 使用 Grover 算法,复杂度从 2^n 变为 \sqrt{2^n}。即 2^{128} 变成 2^{64}。虽然变弱了,但 2^{64} 依然是一个非常高的门槛。
    ​破解密钥: 使用 Shor 算法,Ed25519 这种非对称加密会被彻底攻破(复杂度变为多项式级 O(n^3))。

    AI 回答,供参考
    ronman
        33
    ronman  
       6 小时 39 分钟前
    现在这个背景下,这种话题和 ai 讨论,没必要发帖
    Overfill3641
        34
    Overfill3641  
       6 小时 34 分钟前   ❤️ 1
    开密码,一堆 IP 在那尝试破解,你越 BAN 对方越起劲。
    用密钥,对方尝试下就不鸟你了。
    moudy
        35
    moudy  
       6 小时 17 分钟前 via iPhone
    @Admstor 信息安全是一个体系,不光是密码复杂度这一项指标。密钥管理,算法,日常安全更新频率,加密流程都会影响整体安全性。
    liuzimin
        36
    liuzimin  
       6 小时 12 分钟前 via Android
    为啥没人提 2FA ?我给 ssh 加了个 OTP 的 2FA ,感觉很安心。而且也带多次输错自动 BAN 一段时间的功能。
    psllll
        37
    psllll  
       5 小时 59 分钟前
    记性差的话开了 auto-ban 基本上都是挡自己,自己还得去服务商面板那里解除
    GoldenSheep
        38
    GoldenSheep  
       4 小时 56 分钟前
    我用 ssh-agent,私钥从不落盘
    restkhz
        39
    restkhz  
       4 小时 46 分钟前
    @Admstor OK, 你想谈安全。
    你要从抵抗暴力破解来说,你这种情况完全足够了。非常安全。

    但是!

    从设计思路上来说,“口令”这种东西就是要给对方进行验证的。你有 secret,我也有,我要给你看 secret 来证明我有。两端都一定会要存有 secret ,并且在验证的时候这个 secret 一定会被传输。
    公钥认证的思路是我们 secret 从不离开自己的设备。只要做一次 challenge-response 证明你有 secret 就可以. 我们只是用 secret 签名,secret 不会被传输,甚至服务器上都不需要存有 secret 存在.

    你觉得哪种设计更安全?以后能暴露的攻击面更少?

    你的对手会的不只是暴力破解。secret 出现的地方越多,出问题的可能性越大。我理解你讲的比如如果我密码足够强就算黑客读到/etc/shadow 也破不出来,和黑客拿到公钥没用同理。然而一旦出现 secret 明文本身呢?楼上也有说到 PAM 模块直接拦截读取明文的,这就是问题。但是我们或许应该在一开始就直接掐死这种可能。只要 secret 压根不出现在服务器上,不被传输,就没这些事情了。



    我们抛开上面的理论层面的东西,
    在现实世界中,合理的密码的确足够强。我自己也有不少设备和 VM 都是用密码的。小规模使用其实不会有任何问题,这也是为什么他至今都存在。
    问题就是它经常被不合理使用,而且随着规模的扩大它只会越来越不方便。所以到一定规模的时候,我认为,使用公钥的最大原因就是:方便管理

    安全这种东西你永远不能指望用户。用户是可以用 123456 作为密码的,是可以为了看毛片随手运行 exe 并且卸载杀毒软件的。更不要说定期更换密码,16 位大小写数字符号组合。所以不如直接逼着用户用更复杂的一套算了。


    所以回到问题本身,我觉得公钥的确是更安全的,从理论和应用上都是。我希望我说清楚了。


    顺便我在某个实验室做运维,管理 100+的 OS ,你猜猜我们用什么做 SSH 验证?密码?公钥?





    答案:都不是,我们用 kerberos
    kerberos 就更安全吗?没有。单纯就是管理方便。

    安全不安全,你得带着威胁模型再讨论。在你提出的问题中,如果仅考虑暴力等等的,你这的确安全。
    但是考虑防御纵深,那就不如公钥那么安全。就这样。管理也没那么方便。
    ryd994
        40
    ryd994  
       2 小时 10 分钟前 via Android
    “只计算大小写英文+数字,组合就有 62 的 16 次方”
    我不信你能记住任意 16 位纯随机密码。人能记住的信息量是有限的。你的 16 位密码大概率是包含了方便记忆的单词或者数字(比如日期),这些都会被优先穷举。
    记不住怎么办?大部分人都会偷偷用笔记下来或者记在手机里,这就非常不安全。这一点对于多人访问的项目来说非常重要,因为你不能指望所有人都和你一样记性好。

    ssh 密钥文件存在电脑里的话,那和 ssh 密码写下来一样不安全。但是 ssh 密钥还可以放到硬件密钥里,无法读取,只能用于握手。这就安全了百倍。

    其次,密钥认证可以防止蜜罐。如果你有一台服务器被植入病毒。病毒完全可以修改 ssh 登入程序,偷偷记录密码,然后到你其他服务器上使用。但是密钥认证全程不传输密钥本身。密钥只是用来签名握手数据。

    总之,密钥认证不仅更安全,还更方便。我反正是不可能背 64 位纯随机密码的。你爱背你背。
    NonResistance
        41
    NonResistance  
       1 小时 42 分钟前 via iPhone
    op 认为 16<4096
    allplay
        42
    allplay  
       55 分钟前 via Android
    前面有人提到了密钥交换过程,怕楼主还没明白,再解释一下:
    比如服务器是一个 http 协议的网页,你在上面输密码,密码明文传输过去,那这整个过程所有人都能看见。
    为了保护这个输密码的过程,以及所有的数据传输,现在都用 HTTPS ,这个 HTTPS 本来就是公钥私钥体体制的呀。
    这道理明白吧。

    不仅登录要认证,传输内容也要加密。

    ssh 同理,是先建立公钥交换的加密隧道,然后才给你输入密码的机会。你第一次登录服务器的时候,在输入密码之前,是不是有个问你是否信任服务器指纹的选项? yes no ?这就是服务器的公钥!
    所以公钥机制你是回避不了的。
    GeruzoniAnsasu
        43
    GeruzoniAnsasu  
       50 分钟前   ❤️ 1
    密码:你先告诉我秘密以便证明身份
    非对称加密体系: 我**不需要告知任何秘密**就能证明我的身份
    allplay
        44
    allplay  
       47 分钟前 via Android
    我理解公钥私钥只是一个更加复杂的密码
    -
    你这个理解从根本上是错误的。
    公钥私钥的本意是解决加密通信密钥传输问题的。你登录服务器时,如果没有公钥首先建立加密通道(用户无感,所以你不知道)的话,那么你输入密码这个过程,本身就立马暴露了。
    allplay
        45
    allplay  
       39 分钟前 via Android
    如果没有公钥,你输入的密码必须明文传输给服务器,那么这时候,从你家出去,在几百公里的线路上,经过 n 个交换机路由器,任何人都可以大摇大摆地窃听你传的那一段你以为很强的!多位的明文是什么。可笑不。

    从历史上,在公钥体系建立起起之前,商业信函的很大一部分是在分发密钥,纸质打印的密码。这样才能安全地(彻底安全吗?)把密码告诉对方。
    szdosar
        46
    szdosar  
       8 分钟前 via iPhone
    密码难不难猜,只是是否 [安全] 的衡量标准其中之一。同时还有管理便捷和易实现性,也是很重要的安全考量指标之一。每换一个密码,成本太高,要公告所有应该知道密码的人
    aulayli
        47
    aulayli  
       1 分钟前 via Android
    那我问你,你用复杂的长密码你记的住吗?如果记不住你是不是要把密码保存哪里?复杂的长密码你能保证每次都手动输入不用复制粘贴吗?密码验证的原理还需要把密码发送到服务器进行验证,这些环节是不是增加了很多泄露的风险。

    使用密钥就没有这些烦恼了,密钥有公钥和私钥,只有公钥需要上传到服务器,就算你把公钥公开到全网也没关系,因为私钥文件永远存放在你本地,密钥也不会上传到远程服务器,只是用来加密消息,你的公钥加密的信息只有你的私钥能解开,你的私钥加密的信息也只有你的公钥能验证是否来自于你本人,跟密码相比这样是不是更方便更安全。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   983 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:57 · PVG 05:57 · LAX 13:57 · JFK 16:57
    ♥ Do have faith in what you're doing.