|
@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 就更安全吗?没有。单纯就是管理方便。
安全不安全,你得带着威胁模型再讨论。在你提出的问题中,如果仅考虑暴力等等的,你这的确安全。
但是考虑防御纵深,那就不如公钥那么安全。就这样。管理也没那么方便。 |