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

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

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

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



    私钥加密公钥解密?好像不可能啊
    25 回复  |  直到 1970-01-01 08:00:00 +08:00
        1
    lululau   2013-11-17 10:10:10 +08:00
    应该是有问题的,sshd 应该是用用户的 pub key 先讲此随机 token 加密,然后将加密后的 token 发送给客户端,客户端用 priv key 解密,然后将解密后的 token(是否是以原文形式我就不清楚了)发送给 server,server 得到客户端传输过来的解密过的 token 就可以确认此客户端拥有登录权限
        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
        4
    lululau   2013-11-17 10:13:06 +08:00   ♥ 1
    @rrfeng 我记得非对称密钥系统只是要求公钥加密的只能由对应的私钥解密,但是有些加密算法,比如 RSA 反过来也是可以的
        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.

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

    这个本来就是非对称加密的两个核心,缺一不可,所有非对称加密都得实现
        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
        9
    9hills   2013-11-17 10:25:36 +08:00
    另外签名其实就是加密。。。
        10
    rrfeng   2013-11-17 10:33:18 +08:00
    @9hills
    ssh 客户端首先会发送用户名和对应的公钥,服务端对比用户名和该用户下的 authentied_keys ,如果符合,那么发起 challenge ,用公钥加密消息,客户端必须解密才能通过认证。


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

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

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

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

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

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

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

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

    连host key都没提
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2199 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 26ms · UTC 05:12 · PVG 13:12 · LAX 21:12 · JFK 00:12
    ♥ Do have faith in what you're doing.