RSA加密算法和SSH远程连接服务器

服务器端与客户端的密钥系统不一样,称为非对称式密钥系统
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生成公钥、私钥对的过程: 
  1. 选择2个1024bits的大质数p和q
  2. 计算n = pq,z = (p-1)(q-1)
  3. 选择e (满足e<n),使e与z 之间没有公因子,即e, z互质
  4. 选择d使得ed-1刚好可以被z整除(即: ed mod z = 1 )
  5. 得到公钥: (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 
原文地址:https://www.cnblogs.com/yangyuliufeng/p/9238075.html