服务器端与客户端的密钥系统不一样,称为非对称式密钥系统
RSA算法的基础是模运算x mod n,事实上:
[(a mod n) + (b mod n)] mod n = (a+b) mod n
[(a mod n) - (b mod n)] mod n = (a-b) mod n
[(a mod n) * (b mod n)] mod n = (a*b) mod n
因此有(a mod n)^d mod n = a^d mod n
报文/信息(message)其实仅仅是一个比特模式(bit pattern),每个比特模式可以表示为一个唯一的整数,加密一个报文就等价于加密一个数
为了加密m,我们可以加密对应的数,得到一个新的数(即密文)
RAS生成公钥、私钥对的过程:
- 选择2个1024bits的大质数p和q
- 计算n = pq,z = (p-1)(q-1)
- 选择e (满足e<n),使e与z 之间没有公因子,即e, z互质
- 选择d使得ed-1刚好可以被z整除(即: ed mod z = 1 )
- 得到公钥: (n,e);私钥:(n,d)
加密报文m (m<n)时,计算c = m^e mod n
解密密文c时,计算m = c^d mod n
有m = (m^e mod n)^d mod n = m^ed mod n = (m^d mod n)^e mod n
利用公钥加密,可以利用私钥解密
利用私钥加密,可以利用公钥解密
RSA的安全性建立在“大数分解和素性检测”这个数论难题的基础上。将两个大素数相乘在计算上容易实现,而将该乘积分解的计算量相当大
已知公钥求解私钥,相当于在不知道两个因子p和q的前提下,找出n的因子,很难
但其计算速度很慢,因此往往利用公钥加密建立安全连接,然后建立第二个密钥-对称会话密钥,用于加密数据
远程连接服务器主要有三种:
文字接口明码:telnet,rsh等为主
文字接口密码:SSH(Secure SHELL protocol)为主
图形接口:Xdmcp,VNCRDP
SSH有两种加密算法,默认RSA加密算法
开启sshd服务:
[root@localhost ~]# rm /etc/ssh/ssh_host* [root@localhost ~]# service sshd restart Redirecting to /bin/systemctl restart sshd.service [root@localhost ~]# date Tue Jul 11 21:46:05 EDT 2017 [root@localhost ~]# ll /etc/ssh/ssh_host* -rw-r-----. 1 root ssh_keys 227 Jul 11 21:45 /etc/ssh/ssh_host_ecdsa_key -rw-r--r--. 1 root root 162 Jul 11 21:45 /etc/ssh/ssh_host_ecdsa_key.pub -rw-r-----. 1 root ssh_keys 387 Jul 11 21:45 /etc/ssh/ssh_host_ed25519_key -rw-r--r--. 1 root root 82 Jul 11 21:45 /etc/ssh/ssh_host_ed25519_key.pub -rw-r-----. 1 root ssh_keys 1675 Jul 11 21:45 /etc/ssh/ssh_host_rsa_key -rw-r--r--. 1 root root 382 Jul 11 21:45 /etc/ssh/ssh_host_rsa_key.pub [root@localhost ~]# netstat -tlnp | grep ssh Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 16016/sshd tcp6 0 0 :::22 :::* LISTEN 16016/sshd
ssh 账号@主机ip
不写账号会默认以本地端账号登入远程
ssh -f student@127.0.0.1find / &> ~/find1.log
-f 不登入远程主机只发送一个指令过去
服务器公钥记录文件 ~/.ssh/known_hosts
若接收到的公钥尚未记录,则询问用户是否记录
若接收到的公钥已经记录,则进行对比,不同会发出警告
scp XXX.tar root@ipaddress:/root/(目标)
scp student@127.0.0.1:/etc/bashrc /tmp
-r 递归地复制文件夹
[root@www ~]# sftp student@localhost sftp> lls /etc/hosts /etc/hosts sftp> put /etc/hosts Uploading /etc/hosts to /home/student/hosts sftp> ls -a . .. .bash_history .bash_logout .bash_profile .bashrc .mozilla hosts sftt> lcd /tmp sftp> lpwd Local working directory: /tmp sftp> get .bashrc Fetching /home/student/.bashrc to .bashrc /home/student/.bashrc 100% 124 0.1KB/s 00:00 sftp> lls -a . .font-unix keyring-rNd7qX .X11-unix .. .gdm_socket lost+found scim-panel-socket:0-root .bashrc .ICE-unix mapping-root .X0-lock sftp> exit
制作不用密码立刻可以登入的ssh用户
[root@localhost ~]# ssh-keygen -t rsa/dsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again:
产生了两个文件~/.ssh/id_rsa(-rw-------)和~/.ssh/id_rsa.pub
将公钥内容放置到服务器端的~/.ssh/authorized_keys(-rw-r--r--)下
ssh-copy-id -i ~/.ssh/id_rsa.pub remote-host可以将key直接写入远程机器的authorized_keys中
之后通过SSH登录远程机器不再需要密码
[root@VM_6_187_centos ~]# ldd $(which sshd) | grep libwrap libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f0430674000) [root@VM_6_187_centos ~]# ldd $(which httpd) | grep libwrap
SSH有支持tcp wrappers所提供的libwrap.so这个函式库档案,可以使用/etc/host.{allow,deny}进行类似防火墙的抵抗机制,http则不可以
控制远程访问设置:
[root@www ~]# vim /etc/hosts.allow sshd: 127.0.0.1 192.168.1.0/255.255.255.0 192.168.100.0/255.255.255.0 [root@www ~]# vim /etc/hosts.deny sshd : ALL
这两个文件的格式都是一样的<service(program_name)> : <IP, domain, hostname> : <action>
hosts.allow的action默认allow,hosts.deny的action默认deny