SSH Key登录与初识RSA加密
本文讲述了如何为远程服务器设置SSH Key的登录方式,并简单了解了下什么是RSA算法,我也初步学习了下那看起来挺复杂的数学关系😳
要用Key
管理远程服务器经常需要用SSH登录,而常见的用户名加密码的方式极易遭到爆破,即使是Vultr这种虚拟主机提供商能够提供随机的复杂密码,但一直承受爆破攻击也会影响正常登录使用。在寒假的时候我的一个Server受到了这种攻击。这种攻击来自全球各地,从连云港到丹麦,甚至还有虚拟IP的主机,因此使用另一种登录方式来保证加强自己主机的安全就非常必要了。
如果使用了密码认证,被爆破时会在登录上以后显示登录尝试失败的IP和尝试次数、尝试时间等。
本文中使用:
64位CentOS 7
Putty 工具
WinSCP工具
本文中考虑的情况为单向登录,即只考虑在A机器上登录B机器,而不考虑既能从A登录B又能从B登录A的情况。
设置Key
首先使用用户名+密码的方式登录Server
生成RSA密钥
ssh-keygen -t rsa
,这个命令会生成密钥文件(id_rsa.pub)和私钥文件(id_rsa)生成密钥时选择默认位置即可,同时可以选择为密钥增加密码(设置密码后,使用密钥时还需要输入密码)
cd
进入生成密钥的文件夹,默认位置为/root/.ssh
,ls
之后能够看到上面生成的两个加密文件在生成密钥的文件夹下执行修改文件名和文件夹权限的操作
1
2mv id_rsa.pub authorized_keys
chmod 600 authorized_keys注意修改文件夹的权限**不要改成
777
**,600
已经足够了,777
权限太大,没有必要。使用WinSCP将两个文件下载下来,保存好为后面做准备
因为我的Server上已经安装了Vim了,所以可以用Vim对配置文件进行编辑,没有Vim的话可以直接用vi,或者使用
yum install vim
进行安装(CentOS 7)编辑
sshd_config
,vim /etc/ssh/sshd_config
将PubkeyAuthentication
前的#
去掉,加入一行RSAAuthentication yes
,保存其他的SSH端口什么的也可以改,改完还需要在
Firewall
中进行相应的修改保存后重启SSHD服务,
systemctl restart sshd.service
使用Key
- 打开
puttygen
软件,将下载的id_rsa
文件载入(Load),如果之前设置了密码,则需要使用密码才能载入,在Key passphrase
处同样可以设置密钥的密码,不设置也行。 - 点击
Save private key
保存putty
的*.ppk
密钥文件。 - 在
putty
的终端输入IP地址和端口号,再在左边的Category
下找到Connection-SSH-Auth
,在Private key file for authentication
处加载刚才生成的*.ppk
文件,然后返回Session
中,保存设置 - 然后正常登录,如果刚才设置了密码则需要输入密码才能登录。
- 登录后在
sshd_config
里关闭密码认证选项,vim /etc/ssh/sshd_config
- 将
PasswordAuthentication
后面改为no
,然后重启SSHDsystemctl restart sshd.service
- 之后就只能使用密钥方式进行登录了。
简单学习下RSA
RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式解破。到当前为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。
生成公钥和私钥
随意选择两个大的质数$p$和$q$,$p$不等于$q$,计算$N=pq$。
根据欧拉函数,求得${ r=\varphi (N)=\varphi (p)\varphi (q)=(p-1)(q-1)}$
选择一个小于$r$的整数$e$,使$e$与$r$互质。并求得$e$关于$r$的模反元素,命名为$d$(求$d$令$ed≡1\quad(modr)ed≡1\quad(modr)$)。(模反元素存在,当且仅当$e$与$r$互质)
将$p$和$q$的记录销毁。
$(N,e)$是公钥,$(N,d)$是私钥。公钥发送给所有的通信对象(对服务器来说就是所有的客户端),私钥则必须保管好,防止泄露。
加密消息
假设客户端要向服务器发送消息$m$,服务器的公钥是$N$和$e$。客户端将消息$m$转换为一个小于$N$的非负整数$n$,比如可以将每一个字转换为这个字的Unicode
码,然后将这些数字连在一起组成一个数字。假如信息非常长的话,可以将这个信息分为几段,然后将每一段转换为$n$。用下面这个公式他可以将$n$加密为$c$:
$$
c≡n^e\quad(modN)
$$
计算$c$并不复杂。客户端算出$c$后就可以将它传递给服务器。
解密消息
得到消息$c$后,可以利用密钥$d$来解码。可以用下面这个公式来将$c$转换为$n$:
$$
c^d≡n(modN)
$$
得到$n$后,可以将原来的信息$m$重新复原。
解码的原理是:
$$
c^d≡n^{e⋅d} (mod N)
$$
已知$ed≡1\quad(mod r)$,即$ed=1+h\varphi(N)$。由欧拉定理得:
$$
n^{ed}=n^{1+hφ(N)}=n(n^{φ(N)})^h≡n(1)^h\quad(modN)≡n\quad(modN)
$$
签名消息
RSA 也可以用来为一个消息签名。
对消息字符串的散列值(Message digest,用 MD5、SHA256 等算法求得的长度较短且固定的字符串)使用 RSA 的私钥计算签名(实际上仍然是加密消息)后,得到一个签名字符串,将其附加在消息字符串的合适位置后,一并发送。接收方使用对应的公钥可以从签名字符串中解密出原来的散列值,同时对原始消息再计算一次散列值。二者相比较,假如两者相符的话,则认为发信人持有正确的私钥,并且这个消息在传播路径上没有被篡改过。
密钥长度
用户应使用 1024 位密钥,证书认证机构应用 2048 位或以上。
特点
RSA 之所以叫非对称算法,是因为加密和解密的密钥不一样。任何一个密钥都可以用来加密。
公钥和私钥
通过私钥可以轻松计算出公钥,反之则不行。
随机选择两个不相等的质数$p$和$q$,$p$不等于$q$,计算$N=pq$。
这里选择103和349。$N=pq=35947$ 。$N$的长度就是密钥长度。35947 对应的二进制是 1000110001101011,一共有 16 位,所以这个密钥就是 16 位。实际应用中 RSA 密钥一般是1024位。
计算$N$的欧拉函数$\varphi(N)$ 。$r=\varphi(35947)=\varphi(103)\varphi(349)=(102)(348)=35496$ 。
选择一个小于$r$的整数$e$,使$e$与$r$互质,这里取$e=773$ 。
求$e$关于$r$的模反元素,命名为$d$ (求$d$令$ed≡1\quad(modr)ed≡1\quad(modr)$ )。最终转为$773d-1=35496k$这个二元一次方程,求得一组解$(d,k)=(45,1)$。
将$(N,e)$封装成公钥,$(N,d)$封装成私钥。所以公钥就是$(35496 ,773)$,私钥就是$(35496 , 45)$。
加密与解密
用公钥加密时,私钥可以解密。反之亦然,私钥加密后的信息用公钥可以解密。
缺点
然而,虽然RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何。
此外,RSA的缺点还有:
- 产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。
- 分组长度太大,为保证安全性,n 至少也要 600 bits 以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。
因此,使用RSA只能加密少量数据,大量的数据加密还要靠对称密码算法。
已公开的或已知的攻击方法
大数因数分解
针对RSA最流行的攻击一般是基于大数因数分解。1999年,RSA-155 (512 bits)被成功分解,花了五个月时间(约8000 MIPS年)和224 CPU hours在一台有3.2G中央内存的Cray C916计算机上完成。
2009年12月12日,编号为RSA-768(768 bits, 232 digits)数也被成功分解[9]。这一事件威胁了现通行的1024-bit密钥的安全性,普遍认为用户应尽快升级到2048-bit或以上。
时间攻击
1995年有人提出了一种非常意想不到的攻击方式:
假如Eve对Alice的硬件有充分的了解,而且知道它对一些特定的消息加密时所需要的时间的话,那么她可以很快地推导出d。
这种攻击方式之所以会成立,主要是因为在进行加密时所进行的模指数运算是一个比特一个比特进行的,而比特为1所花的运算比比特为0的运算要多很多,因此若能得到多组消息与其加密时间,就会有机会可以反推出私钥的内容。