关于密码

此篇文章记录了关于一些密码学上的入门知识和常识,主要包括:

  • 对称加密,非对称加密,消息摘要算法
  • 对称加密非对称加密在HTTPS中的应用数字证书
  • MD5应用
  • SSH登录原理和实际操作

目前常用的加密算法主要分成三类:

  • 对称加密算法
  • 非对称加密算法
  • 消息摘要算法

在互联网中,信息防护主要涉及两个方面:信息窃取和信息篡改。对称/非对称加密算法能够避免信息窃取,而消息摘要算法能够避免信息篡改。

对称加密,非对称加密,消息摘要算法

1. 对称加密算法

发送方和接收方需要持有同一把密钥,发送消息和接收消息均使用该密钥。

相对于非对称加密,对称加密具有更高的加解密速度,但双方都需要事先知道密钥,密钥在传输过程中可能会被窃取,因此安全性没有非对称加密高。目前主要有DES算法(56位已经不安全),AES算法(128位理论上可破解,实际上不可破解),IDEA算法

2. 非对称加密算法

接收方在发送消息前需要事先生成公钥和私钥,然后将公钥发送给发送方。发送放收到公钥后,将待发送数据用公钥加密,发送给接收方。接收到收到数据后,用私钥解密。

在这个过程中,公钥负责加密,私钥负责解密,数据在传输过程中即使被截获,攻击者由于没有私钥,因此也无法破解。

非对称加密算法的加解密速度低于对称加密算法,但是安全性更高。主要有RSA算法

3. 消息摘要算法

消息摘要算法可以验证信息是否被篡改。

在数据发送前,首先使用消息摘要算法生成该数据的签名,然后签名和数据一同发送给接收者。接收者收到数据后,对收到的数据采用消息摘要算法获得签名,最后比较签名是否一致,以此来判断数据在传输过程中是否发生修改。

无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。例如应用MD5算法摘要的消息有128个比特位,用SHA-1算法摘要的消息最终有160比特位的输出,SHA-1的变体可以产生192比特位和256比特位的消息摘要。一般认为,摘要的最终输出越长,该摘要算法就越安全。变长输入,定长输出。

消息摘要算法所具有的性质:输入改变了,输出也就改变了;两条相似的消息的摘要确不相近,甚至会大相径庭。

消息摘要是单向、不可逆的。只能进行正向的信息摘要,而无法从摘要中恢复出任何的原始消息,甚至根本就找不到任何与原信息相关的信息。

消息摘要算法来源于CRC算法,最初CRC算法是用来验证数据完整性的,即我们常见的奇偶校验码、循环冗余校验,在CRC基础上发展处了MD和SHA量大算法家族,CRC比这些算法都要早,MD算法比SHA算法早,SHA算法是对MD算法的改进。再后来则发展出了可以带有密码的消息摘要算法-MAC算法。

消息摘要算法包括三大类,MD、SHA和MAC算法,MD的分类是按照版本规定的,SHA则是按照适用的消息长度分类的:

  • MD算法: Message Digest Algorithm ,目前主流的是MD5算法,为第五版算法,之前有MD2、MD3、MD4算法。
  • SHA算法:安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。
  • MAC算法:带有密码信息的信息摘要算法,是对MD和SHA算法的演变和改进,包括HmacMD2、HmacMD4、HmacMD5、HmacSHA-256等。

二. 对称/非对称加密算法在HTTPS协议中的应用

HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。具体是如何进行加密,解密,验证的,且看下图。

  1. 客户端发起HTTPS请求 就是用户在浏览器里输入一个https网址,然后连接到server的443端口。
  2. 服务端的配置 采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书(CA中心证书)则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。这套证书其实就是一对公钥和私钥。
  3. 传送证书 这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
  4. 客户端解析证书 这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随即值。然后用证书对该随机值进行加密。
  5. 传送加密信息 这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
  6. 服务段解密信息 服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
  7. 传输加密后的信息 这部分信息是服务段用私钥加密后的信息,可以在客户端被还原
  8. 客户端解密信息 客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容。整个过程第三方即使监听到了数据,也束手无策。

非对称加密算法的性能是非常低的,原因在于寻找大素数、大数计算、数据分割需要耗费很多的CPU周期,所以一般的HTTPS连接只在第一次握手时使用非对称加密,通过握手交换对称加密密钥,在之后的通信走对称加密。

三. 数字证书

1. 公钥传输问题

在密文传输过程中,客户端(Client C)向服务器(Server S)发送数据,C使用S的公钥加密,这样只有S使用自己的私钥解密才能拿到信息,其他人即使得到了数据,没有S的私钥也没用。

但是如果有一个黑客H告诉C自己是S,并将自己的假公钥发送给C,那么C用假公钥加密数据并将数据发送给了H,那么H就顺利得到了信息,无法起到数据加密的作用。

这就需要一个中间人来颁发一个身份证明来证明S是真的S。

2.数字证书认证中心

这个中间人就是数字证书认证机构。

数字证书认证中心(Certificate Authority)(也被称为证书认证机构或CA)是指颁发证书、废除证书、更新证书、验证证书、管理密钥的机构。它能在认证某组织或个人后分发证书的机构,它验证的信息包括已签约的证书,当然它也负责吊销有危害的证书。

3.数字证书

中间人颁发的身份证明就是数字证书。

数字证书是一个包含 证书拥有者公钥、证书拥有者信息、证书认证中心数字签名的文件。 拿到数字证书后,我们解析证书的证书认证机构数字签名确保证书是真的,且没有被篡改过后,取得其中的公钥,然后就可以使用此公钥与浏览器进行交互了。

4.根证书

CA 这么重要,可是怎么能证明 CA 是真的呢?这个不用担心,许多 CA 都有嵌入在浏览器中的根证书,所以浏览器能自动识别它们。在一些API交互中,如请求支付宝的接口时,我们已经在本地存储了支付宝的证书了。

不用担心本地的根证书安全问题,如果本地存储的根证书都被修改了,那么加解密也就没有什么意义了。

5.证书链

由于世界上需要证书的组织众多,任何一家 CA 也不能处理全部的认证请求。于是大大小小的 CA 出现了,可是每个客户端不可能把他们的证书作为根证书全存储起来。

于是CA建立自上而下的信任链,下级 CA 信任上级 CA,下级 CA 由上级 CA 颁发证书并认证。因为下级 CA 的证书是用上级 CA 的密钥加密的,而上级 CA 的密钥只有自己知道,因此别人无法冒充上级 CA 给别人发证书。

在进行证书认证时,服务器会发给客户端一个包含着“证书机构证书”的证书,会层层链接到最上层的 CA,我们本地拥有最上级的 CA 的证书,如果能证明此 CA 的真实性,那么也便能证明服务器证书的可靠。

三. MD5应用

MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。

密码散列函数(Cryptographic hash function),又译为加密散列函数,是散列函数的一种。

主要应用:

1. 一致性验证

MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。比如,在Unix下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如:

MD5 (tanajiya.tar.gz) = 38b8c2c1093dd0fec383a9d9ac940515

MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。

举例描述:

我们常常在某些软件下载站点的某软件信息中看到其MD5值,它的作用就在于我们可以在下载该软件后,对下载回来的文件用专门的软件(如Windows MD5 Check等)做一次MD5校验,以确保我们获得的文件与该站点提供的文件为同一文件。

具体来说文件的MD5值就像是这个文件的“数字指纹”。每个文件的MD5值是不同的,如果任何人对文件做了任何改动,其MD5值也就是对应的“数字指纹”就会发生变化。比如下载服务器针对一个文件预先提供一个MD5值,用户下载完该文件后,用我这个算法重新计算下载文件的MD5值,通过比较这两个值是否相同,就能判断下载的文件是否出错,或者说下载的文件是否被篡改了。

利用MD5算法来进行文件校验的方案被大量应用到软件下载站、论坛数据库、系统文件安全等方面。

2. 数字签名

MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫 readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。

3. 安全访问认证

MD5还广泛用于操作系统的登陆认证上,如Unix、各类BSD系统登录密码、数字签名等诸多方面。如在Unix系统中用户的密码是以MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行MD5 Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。

4. 算法原理

对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值

5. 编码实战:

@Test
public void MD5Test(){
    String password = “!ytd1129097428”;
    String md1 = MD5Util.MD5(password);
    String md2 = MD5Util.generate(password);
    System.out.println(“加密前:”+password);
    System.out.println(“普通MD5加密后:”+md1);
    System.out.println(“加盐MD5加密后:”+md2);
    System.out.println(“比较原文和加盐MD5加密之后是否一致:”+MD5Util.verify(password,md2));
}

 输出结果:

加密前:!ytd1129097428

普通MD5加密后:add4ff4fb01ace59713390dc5876d5d0

加盐MD5加密后:96b911880466d91d3244f37bd56c4531967c28d65181f191

比较原文和加盐MD5加密之后是否一致:true

Q3:3.什么是MD5加盐?

A3:比如我的银行密码是”12345”

1.得到的MD5是:827ccb0eea8a706c4c34a16891f84e7b

2.一个人截取到这个密文,那么通过撞库肯定容易撞出12345.

3.我们要做的就是加盐,银行密码还是”12345”,然后我把银行密码加上我特定的字符串才计算MD5 所以密码还是那个密码,但是变成求”12345密码加密987”的MD5值,然后再得到MD5,那么这个MD5起码可以确认那个数据库不会有.

四. SSH登录原理和实际操作

主要有两种登录方式:第一种为密码口令登录,第二种为公钥登录

密码口令登录

  通过密码进行登录,主要流程为:

  •     1、客户端连接上服务器之后,服务器把自己的公钥传给客户端
  •     2、客户端输入服务器密码通过公钥加密之后传给服务器
  •     3、服务器根据自己的私钥解密登录密码,如果正确那么就让客户端登录

  公钥登录是为了解决每次登录服务器都要输入密码的问题,流行使用RSA加密方案,主要流程包含:

  •     1、客户端生成RSA公钥和私钥
  •     2、客户端将自己的公钥存放到服务器
  •     3、客户端请求连接服务器,服务器将一个随机字符串发送给客户端
  •     4、客户端根据自己的私钥加密这个随机字符串之后再发送给服务器
  •     5、服务器接受到加密后的字符串之后用公钥解密,如果正确就让客户端登录,否则拒绝。这样就不用使用密码了。

公钥与私钥使用场景:

  •  (1)私钥用来进行解密和签名,是给自己用的。
  •  (2)公钥由本人公开,用于加密和验证签名,是给别人用的。
  •    (3)当该用户发送文件时,用私钥签名,别人用他给的公钥验证签名,可以保证该信息是由他发送的。当该 用户接受文件时,别人用他的公钥加密,他用私钥解密,可以保证该信息只能由他接收到。

1. 制作密钥对

首先在服务器上制作密钥对。首先用密码登录到你打算使用密钥登录的账户,然后执行以下命令:

[root@host ~]$ ssh-keygen  <== 建立密钥对
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): <== 按 Enter
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): <== 输入密钥锁码,或直接按 Enter 留空
Enter same passphrase again: <== 再输入一遍密钥锁码
Your identification has been saved in /root/.ssh/id_rsa. <== 私钥
Your public key has been saved in /root/.ssh/id_rsa.pub. <== 公钥
The key fingerprint is:
0f:d3:e7:1a:1c:bd:5c:03:f1:19:f1:22:df:9b:cc:08 root@host

密钥锁码在使用私钥时必须输入,这样就可以保护私钥不被盗用。当然,也可以留空,实现无密码登录。

现在,在 root 用户的家目录中生成了一个 .ssh 的隐藏目录,内含两个密钥文件。id_rsa 为私钥,id_rsa.pub 为公钥。

2. 在服务器上安装公钥

键入以下命令,在服务器上安装公钥:

[root@host ~]$ cd .ssh
[root@host .ssh]$ cat id_rsa.pub >> authorized_keys

如此便完成了公钥的安装。为了确保连接成功,请保证以下文件权限正确:

[root@host .ssh]$ chmod 600 authorized_keys
[root@host .ssh]$ chmod 700 ~/.ssh

3. 设置 SSH,打开密钥登录功能

编辑 /etc/ssh/sshd_config 文件,进行如下设置:

RSAAuthentication yes
PubkeyAuthentication yes

另外,请留意 root 用户能否通过 SSH 登录:

PermitRootLogin yes

当你完成全部设置,并以密钥方式登录成功后,再禁用密码登录:

PasswordAuthentication no

最后,重启 SSH 服务:

[root@host .ssh]$ service sshd restart

4. 将私钥下载到客户端,然后转换为 PuTTY 能使用的格式

使用 WinSCP、SFTP 等工具将私钥文件 id_rsa 下载到客户端机器上。然后打开 PuTTYGen,单击 Actions 中的 Load 按钮,载入你刚才下载到的私钥文件。如果你刚才设置了密钥锁码,这时则需要输入。

载入成功后,PuTTYGen 会显示密钥相关的信息。在 Key comment 中键入对密钥的说明信息,然后单击 Save private key 按钮即可将私钥文件存放为 PuTTY 能使用的格式。

今后,当你使用 PuTTY 登录时,可以在左侧的 Connection -> SSH -> Auth 中的 Private key file for authentication: 处选择你的私钥文件,然后即可登录了,过程中只需输入密钥锁码即可。

参考链接:

https://cloud.tencent.com/developer/article/1078014

https://www.cnblogs.com/zhenbianshu/p/6285437.html

https://blog.csdn.net/jnshu_it/article/details/83858002

https://blog.csdn.net/m0_38054145/article/details/80993690

https://www.cnblogs.com/scofi/p/6617394.html

https://blog.csdn.net/m0_38054145/article/details/80993690

https://blog.csdn.net/m0_38054145/article/details/80993690

《关于密码》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注