|  |      1lululau      2013-11-17 10:10:10 +08:00 应该是有问题的,sshd 应该是用用户的 pub key 先讲此随机 token 加密,然后将加密后的 token 发送给客户端,客户端用 priv key 解密,然后将解密后的 token(是否是以原文形式我就不清楚了)发送给 server,server 得到客户端传输过来的解密过的 token 就可以确认此客户端拥有登录权限 | 
|  |      2rrfeng      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 | 
|  |      3lululau      2013-11-17 10:11:34 +08:00  1 | 
|  |      4lululau      2013-11-17 10:13:06 +08:00  1 @rrfeng 我记得非对称密钥系统只是要求公钥加密的只能由对应的私钥解密,但是有些加密算法,比如 RSA 反过来也是可以的 | 
|  |      59hills      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. 私钥可以签名,公钥可以查看签名是否正确 | 
|  |      69hills      2013-11-17 10:16:54 +08:00 @lululau 这个有个问题,ssd首先得知道用户到底是谁,所以第一步必然是用户用自己的私钥进行签名后发出,sshd才知道连接上的用户到底是谁,否则ssd用auth_keys中哪个公钥来加密数据呢 | 
|  |      89hills      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 | 
|  |      99hills      2013-11-17 10:25:36 +08:00 另外签名其实就是加密。。。 | 
|  |      10rrfeng      2013-11-17 10:33:18 +08:00 @9hills  ssh 客户端首先会发送用户名和对应的公钥,服务端对比用户名和该用户下的 authentied_keys ,如果符合,那么发起 challenge ,用公钥加密消息,客户端必须解密才能通过认证。 其实我觉得, 1. 服务器用公钥加密,客户端解密后发回 2. 服务器发送消息,私钥加密,公钥若能解开则通过 两种方式都可以呀 | 
|  |      12min      2013-11-17 10:40:23 +08:00 此人不懂技术到处乱抄,看他的文章不如去看wiki rfc man page或者源码 他一篇关于secure boot的文章也是狗屁不通的 | 
|  |      139hills      2013-11-17 11:50:59 +08:00 | 
|  |      14ms2008      2013-11-17 13:11:00 +08:00  1 RFC其实并没有很严格的规定,很多都是建议、约定之类的术语。很多实际中已经有应用了,然后才出RFC,所以RFC也是比较混乱的 | 
|  |      15raptium      2013-11-17 13:20:38 +08:00 私钥不应该用来加密,可以用来签名 如果使用私钥对随机生成的数据进行加密,那么对方就能构造请求来骗取签名了 | 
|  |      16andy12530      2013-11-17 14:29:32 +08:00 我记得非对称加密方式是,私钥用来签名,解密,公钥用来加密的。 如果私钥都能解密,那还搞个毛线,随便谁都能解开,能加加密?! | 
|  |      17iZr      2013-11-17 15:02:14 +08:00  1 这个人好像很出名?v2ex 两次出现 | 
|  |      21dagger OP 看了大家这么多讨论,都查了一下,顿时感觉之前知道的还太少,至少私钥加密公钥解密这句话还是对的。后来又去google了些关键词,找到了这么一问 http://security.stackexchange.com/questions/23227/ 貌似回答者对sshv2公钥登录的描述就是 @9hills 同学讲的,而对sshv1的说法和 @rrfeng 同学的讲法差不多 | 
|      22SharkIng      2013-11-18 08:33:21 +08:00 虽然我不是很了解这个问题, 但是我觉得应该没什么大的错误 私钥和公钥是一对,互有签名的,互相验证,公钥是你给别人的, 别人通过公钥联系上你的某个服务器然后经过和私钥的配对解密 .--. /.-. '----------. \'-' .--"--""-"-' '--' | 
|      23Keyes      2013-11-18 09:09:01 +08:00 @andy12530 非对称加密都可以的,一副密钥对,留下不给别人的叫私钥,给别人的叫公钥,两个都可以一个加密另外一个解密 = = | 
|      25julyclyde      2013-11-19 16:39:02 +08:00 咳,一个外行写的文章,意思大概就行了 还深究什么细节啊…… 连host key都没提 | 
|  |      26flyhelan      2021-02-01 14:50:15 +08:00 阮一峰没说错。因为这一步是远程主机来验证对方的,所以一样需要加密和解密。 而私钥和公钥的加密运算本来就是互为逆运算,所以 无论是 公钥加密私钥解密 还是 私钥解密公钥解密,都是可以的。 在公钥登录这一环节,就采用 私钥加密公钥解密 的签字方法。重点不在于保密那个随机字符串,而是用来相互确认彼此的 私钥 和 公钥 是配得上即可。因为不会出现重复的私钥 公钥 对。所以就足够了。 |