<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>密码存储 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E5%AF%86%E7%A0%81%E5%AD%98%E5%82%A8/</link><description>Recent content in 密码存储 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 16 Dec 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E5%AF%86%E7%A0%81%E5%AD%98%E5%82%A8/index.xml" rel="self" type="application/rss+xml"/><item><title>密码存储</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/security/security-006/</link><pubDate>Wed, 02 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/security/security-006/</guid><description>&lt;p&gt;我们在开发网站或者APP时，首先要解决的问题，就是&lt;strong&gt;如何安全地传输和存储用户的密码&lt;/strong&gt;。一些大公司的用户数据库泄露事件也时有发生，带来非常大的负面影响。因此，如何安全传输存储用户密码，是每位程序员必备的基础。本文将跟大家一起学习，如何安全传输存储用户的密码。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/security/security-006/image-01.webp"&gt;&lt;/p&gt;
&lt;h3 id="1-如何安全地传输用户的密码"&gt;1. 如何安全地传输用户的密码&lt;/h3&gt;
&lt;p&gt;要拒绝用户密码在网络上裸奔，我们很容易就想到使用https协议，那先来回顾下https相关知识吧~&lt;/p&gt;
&lt;h4 id="11-https-协议"&gt;1.1 https 协议&lt;/h4&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/security/security-006/image-02.webp"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;「http的三大风险」&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为什么要使用https协议呢？&lt;strong&gt;http它不香&lt;/strong&gt;吗? 因为http是明文信息传输的。如果在茫茫的网络海洋，使用http协议，有以下三大风险：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;窃听/嗅探风险：第三方可以截获通信数据。&lt;/li&gt;
&lt;li&gt;数据篡改风险：第三方获取到通信数据后，会进行恶意修改。&lt;/li&gt;
&lt;li&gt;身份伪造风险：第三方可以冒充他人身份参与通信。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果传输不重要的信息还好，但是传输用户密码这些敏感信息，那可不得了。所以一般都要使用&lt;strong&gt;https协议&lt;/strong&gt;传输用户密码信息。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;「https 原理」&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;https原理是什么呢？为什么它能解决http的三大风险呢？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;https = http + SSL/TLS, SSL/TLS 是传输层加密协议，它提供内容加密、身份认证、数据完整性校验，以解决数据传输的安全性问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;为了加深https原理的理解，我们一起复习一下 &lt;strong&gt;一次完整https的请求流程&lt;/strong&gt;吧~&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/security/security-006/image-03.webp"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;客户端发起https请求&lt;/li&gt;
&lt;li&gt;服务器必须要有一套数字证书，可以自己制作，也可以向权威机构申请。这套证书其实就是一对公私钥。&lt;/li&gt;
&lt;li&gt;服务器将自己的数字证书（含有公钥、证书的颁发机构等）发送给客户端。&lt;/li&gt;
&lt;li&gt;客户端收到服务器端的数字证书之后，会对其进行验证，主要验证公钥是否有效，比如颁发机构，过期时间等等。如果不通过，则弹出警告框。如果证书没问题，则生成一个密钥（对称加密算法的密钥，其实是一个随机值），并且用证书的公钥对这个随机值加密。&lt;/li&gt;
&lt;li&gt;客户端会发起https中的第二个请求，将加密之后的客户端密钥(随机值)发送给服务器。&lt;/li&gt;
&lt;li&gt;服务器接收到客户端发来的密钥之后，会用自己的私钥对其进行非对称解密，解密之后得到客户端密钥，然后用客户端密钥对返回数据进行对称加密，这样数据就变成了密文。&lt;/li&gt;
&lt;li&gt;服务器将加密后的密文返回给客户端。&lt;/li&gt;
&lt;li&gt;客户端收到服务器发返回的密文，用自己的密钥（客户端密钥）对其进行对称解密，得到服务器返回的数据。&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;「https一定安全吗？」&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;https的数据传输过程，数据都是密文的，那么，使用了https协议传输密码信息，一定是安全的吗？其实不然&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;比如，https 完全就是建立在证书可信的基础上的呢。但是如果遇到中间人伪造证书，一旦客户端通过验证，安全性顿时就没了哦！平时各种钓鱼不可描述的网站，很可能就是黑客在诱导用户安装它们的伪造证书！&lt;/li&gt;
&lt;li&gt;通过伪造证书，https也是可能被抓包的哦。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h4 id="12-对称加密算法"&gt;1.2 对称加密算法&lt;/h4&gt;
&lt;p&gt;既然使用了https协议传输用户密码，还是 &lt;strong&gt;「不一定安全」&lt;/strong&gt;，那么，我们就给用户密码 &lt;strong&gt;「加密再传输」&lt;/strong&gt; 呗~&lt;/p&gt;
&lt;p&gt;加密算法有 &lt;strong&gt;「对称加密」&lt;/strong&gt; 和 &lt;strong&gt;「非对称加密」&lt;/strong&gt; 两大类。用哪种类型的加密算法 &lt;strong&gt;「靠谱」&lt;/strong&gt; 呢？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;对称加密：加密和解密使用 &lt;strong&gt;「相同密钥」&lt;/strong&gt; 的加密算法。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/security/security-006/image-04.webp"&gt; 常用的对称加密算法主要有以下几种哈：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/security/security-006/image-05.webp"&gt; 如果使用对称加密算法，需要考虑 &lt;strong&gt;「密钥如何给到对方」&lt;/strong&gt; ，如果密钥还是网络传输给对方，传输过程，被中间人拿到的话，也是有风险的哦。&lt;/p&gt;
&lt;h4 id="13-非对称加密算法"&gt;1.3 非对称加密算法&lt;/h4&gt;
&lt;p&gt;再考虑一下非对称加密算法呢？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;「非对称加密：」&lt;/strong&gt; 非对称加密算法需要两个密钥（公开密钥和私有密钥）。公钥与私钥是成对存在的，如果用公钥对数据进行加密，只有对应的私钥才能解密。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/security/security-006/image-06.webp"&gt;&lt;/p&gt;</description></item></channel></rss>