\chapter{通讯加密}
数据需要加密。 否则，任何入侵通信系统或监视互联网大门的人都可以得到您对同事所说的话。

更糟的是，如果您是一家公司的老板。 您绝对不想泄漏您经营企业的秘密。 因为这将使您损失数十亿美元甚至更多。

\section{级别一: HTTPS}
仅通过网络传输密码而没有任何保护是不安全的。 拥有网络物理访问权限的任何人都有机会窃取用户密码。

这就是为什么我们需要使用HTTPS \cite{https}。

只要我们可以确保手中的通信设备安全，就可以确保HTTPS级加密是安全的。

HTTPS用于保护数据包传输级别的安全。


\section{级别二: Sha256}
但是，如果我们手中的通讯设备不安全怎么办？ 如果存储在我们设备中的数据可以被我们安装的任何应用程序读取怎么办？ 那可能是个大问题。

甚至还有，如果黑客入侵服务器怎么办？

在服务器或本地设备上以纯文本格式保存我们的用户密码可能是一场灾难。

在这种情况下，我想介绍一下我自己的加密用户密码的方法：使用sha256 \cite{sha256}。
    
\subsection{服务器需要做的事}
\begin{enumerate}
    \item 定义用户数据结构
        \begin{lstlisting}
{
    username:,
    sha256_password:,
    temp_token:,
}
        \end{lstlisting}
    \item 每当用户登录时，我们都会给用户一个临时令牌，该令牌是随机字符串。
    \item 每当用户想要发送或接收消息时，他必须提供服务器之前给他的临时令牌。
    \item 任何传输都应在https下进行，并且密码应为真实密码的哈希字符串。
\end{enumerate}


\subsection{客户端需要做的事}
\begin{enumerate}
    \item 获取其密码的sha256代码。 加些盐会更好。(盐指随机字符串，可以增大破解的难度)
        \begin{lstlisting}
import hashlib
m = hashlib.sha256()
m.update(b"password")
print(m.hexdigest())
        \end{lstlisting}
    \item 将其用户名和哈希密码发送到服务器以获取临时令牌。
    \item 使用该临时令牌与服务器通信，因此服务器将知道是他。
\end{enumerate}


\subsection{Server.py}
\lstinputlisting[language=Python]{data/codes/8/user_management.py}


\subsection{Client.py}
\lstinputlisting[language=Python]{data/codes/8/test_user_management.py}


\subsection{总结}
完成上述操作后，由于本地端和服务器端均未存储任何明文密码，因此我们可以成功验证用户身份而无需担心数据泄漏。 即使黑客获得了sha256密码，他们仍然无法计算真实密码，也无法将sha256密码视为真实密码的替代，因为我们添加了salt。

而且，如果黑客将所有数据存储在服务器上，我们要做的就是更换服务器，更换盐，并通过电子邮件地址验证我们的用户，然后一切都会恢复正常。

为什么使用电子邮件进行帐户恢复？ 由于电子邮件是由第三方管理的，因此黑客无法访问它。(或者说黑客同时黑掉第三方邮件系统的可能性不大)

数据泄漏后，一些公司希望要求其用户更改密码。 这不是必需的。