阮一峰blog里关于公钥登录的描述是不是有问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dagger
V2EX    SSH

阮一峰blog里关于公钥登录的描述是不是有问题

  •  
  •   dagger 2013-11-17 10:00:59 +08:00 7844 次点击
    这是一个创建于 4395 天前的主题,其中的信息可能已经有所发展或是发生改变。
    http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html

    博客原文:
    所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。



    私钥加密公钥解密?好像不可能
    26 条回复    2021-02-01 14:50:15 +08:00
    lululau
        1
    lululau  
       2013-11-17 10:10:10 +08:00
    应该是有问题的,sshd 应该是用用户的 pub key 先讲此随机 token 加密,然后将加密后的 token 发送给客户端,客户端用 priv key 解密,然后将解密后的 token(是否是以原文形式我就不清楚了)发送给 server,server 得到客户端传输过来的解密过的 token 就可以确认此客户端拥有登录权限
    rrfeng
        2
    rrfeng  
       2013-11-17 10:11:27 +08:00
    私钥和公钥加密的数据是可以互相解密的。

    密钥认证登录其实就是签名验证的部分

    http://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95
    lululau
        4
    lululau  
       2013-11-17 10:13:06 +08:00   1
    @rrfeng 我记得非对称密钥系统只是要求公钥加密的只能由对应的私钥解密,但是有些加密算法,比如 RSA 反过来也是可以的
    9hills
        5
    9hills  
       2013-11-17 10:15:12 +08:00
    This method works by sending a signature created
    with a private key of the user. The server MUST check that the key
    is a valid authenticator for the user, and MUST check that the
    signature is valid. If both hold, the authentication request MUST be
    accepted; otherwise, it MUST be rejected.

    私钥可以签名,公钥可以查看签名是否正确
    9hills
        6
    9hills  
       2013-11-17 10:16:54 +08:00
    @lululau 这个有个问题,ssd首先得知道用户到底是谁,所以第一步必然是用户用自己的私钥进行签名后发出,sshd才知道连接上的用户到底是谁,否则ssd用auth_keys中哪个公钥来加密数据呢
    9hills
        7
    9hills  
       2013-11-17 10:18:17 +08:00   2
    @lululau 公钥加密私钥解密,私钥签名公钥验证

    这个本来就是非对称加密的两个核心,缺一不可,所有非对称加密都得实现
    9hills
        8
    9hills  
       2013-11-17 10:24:51 +08:00
    从rfc来看,ruanyifeng的描述也有点问题
    http://tools.ietf.org/html/rfc4252

    ssh公钥验证时,首先是ssh client发送(公钥+通过私钥签名后的字符串),字符串的内容却不是server返回的,server则负责验证签名是否正确(首先检查公钥在不在服务端的auth_keys中,然后用这个公钥进行验证)

    session字符串的内容应该是算法有关,不如rfc给了一个MAY

    string session identifier
    byte SSH_MSG_USERAUTH_REQUEST
    string user name
    string service name
    string "publickey"
    boolean TRUE
    string public key algorithm name
    string public key to be used for authentication
    9hills
        9
    9hills  
       2013-11-17 10:25:36 +08:00
    另外签名其实就是加密。。。
    rrfeng
        10
    rrfeng  
       2013-11-17 10:33:18 +08:00
    @9hills
    ssh 客户端首先会发送用户名和对应的公钥,服务端对比用户名和该用户下的 authentied_keys ,如果符合,那么发起 challenge ,用公钥加密消息,客户端必须解密才能通过认证。


    其实我觉得,
    1. 服务器用公钥加密,客户端解密后发回
    2. 服务器发送消息,私钥加密,公钥若能解开则通过
    两种方式都可以呀
    rrfeng
        11
    rrfeng  
       2013-11-17 10:38:09 +08:00
    @9hills
    第一条消息就带签名的话那就一次性解决了验证问题……
    min
        12
    min  
       2013-11-17 10:40:23 +08:00
    此人不懂技术到处乱抄,看他的文章不如去看wiki rfc man page或者源码

    他一篇关于secure boot的文章也是狗屁不通的
    9hills
        13
    9hills  
       2013-11-17 11:50:59 +08:00
    @rrfeng rfc里是这么写的,第一次请求必须带公钥和签名

    验证通过后,双方都是互相用对方公钥加密就没问题了,好像challenge这步rfc里没写
    ms2008
        14
    ms2008  
       2013-11-17 13:11:00 +08:00   1
    RFC其实并没有很严格的规定,很多都是建议、约定之类的术语。很多实际中已经有应用了,然后才出RFC,所以RFC也是比较混乱的
    raptium
        15
    raptium  
       2013-11-17 13:20:38 +08:00
    私钥不应该用来加密,可以用来签名
    如果使用私钥对随机生成的数据进行加密,那么对方就能构造请求来骗取签名了
    andy12530
        16
    andy12530  
       2013-11-17 14:29:32 +08:00
    我记得非对称加密方式是,私钥用来签名,解密,公钥用来加密的。

    如果私钥都能解密,那还搞个毛线,随便谁都能解开,能加加密?!
    iZr
        17
    iZr  
       2013-11-17 15:02:14 +08:00   1
    这个人好像很出名?v2ex 两次出现
    yoyon
        18
    yoyon  
       2013-11-17 15:53:56 +08:00
    @iZr 他是 黑客与画家 的中文版译者
    momo5269
        19
    momo5269  
       2013-11-17 17:49:14 +08:00
    @iZr 阮文章不错,就是偶尔引用的内容并不是那么可靠,但中心思想没问题....极少数情况像公知...
    momo5269
        20
    momo5269  
       2013-11-17 17:49:38 +08:00
    @iZr 比起某某天天见的大神,靠谱多了 = =
    dagger
        21
    dagger  
    OP
       2013-11-17 23:57:43 +08:00
    看了大家这么多讨论,都查了一下,顿时感觉之前知道的还太少,至少私钥加密公钥解密这句话还是对的。后来又去google了些关键词,找到了这么一问

    http://security.stackexchange.com/questions/23227/

    貌似回答者对sshv2公钥登录的描述就是 @9hills 同学讲的,而对sshv1的说法和
    @rrfeng 同学的讲法差不多
    SharkIng
        22
    SharkIng  
       2013-11-18 08:33:21 +08:00
    虽然我不是很了解这个问题, 但是我觉得应该没什么大的错误

    私钥和公钥是一对,互有签名的,互相验证,公钥是你给别人的, 别人通过公钥联系上你的某个服务器然后经过和私钥的配对解密
    .--.
    /.-. '----------.
    \'-' .--"--""-"-'
    '--'
    Keyes
        23
    Keyes  
       2013-11-18 09:09:01 +08:00
    @andy12530 非对称加密都可以的,一副密钥对,留下不给别人的叫私钥,给别人的叫公钥,两个都可以一个加密另外一个解密 = =
    pyKun
        24
    pyKun  
       2013-11-18 10:03:34 +08:00
    @min

    略有同感,但看过的他文章不多,就不多评价了
    julyclyde
        25
    julyclyde  
       2013-11-19 16:39:02 +08:00
    咳,一个外行写的文章,意思大概就行了
    还深究什么细节啊……

    连host key都没提
    flyhelan
        26
    flyhelan  
       2021-02-01 14:50:15 +08:00
    阮一峰没说错。因为这一步是远程主机来验证对方的,所以一样需要加密和解密。
    而私钥和公钥的加密运算本来就是互为逆运算,所以 无论是 公钥加密私钥解密 还是 私钥解密公钥解密,都是可以的。

    在公钥登录这一环节,就采用 私钥加密公钥解密 的签字方法。重点不在于保密那个随机字符串,而是用来相互确认彼此的 私钥 和 公钥 是配得上即可。因为不会出现重复的私钥 公钥 对。所以就足够了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     824 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 21:29 PVG 05:29 LAX 13:29 JFK 16:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86