在现代社会网络通信的隐私和安全性已成为人们日益关注的重要话题,无论是浏览购物网站、在线银行交易,还是日常的社交媒体互动,我们的个人信息都面临着潜在的风险和威胁。在这篇文章中,将探讨在浏览购物网站时,如何保护我们的隐私和确保信息安全,是谁在保护我们的数据隐私和通信的安全性。

在谈论网络通信的安全性之前,让我们回顾一下人类在通信保密性的发展史。通信的保密性自古以来就是一个重要的问题,人类不断发展新的方法来保护信息的隐私和安全,最早的加密技术可以追溯到古代文明,古希腊和罗马使用了各种简单的加密方法,如凯撒密码(Caesar Cipher),其中每个字母被替换为其后固定位置的字母。

凯撒密码也称为移位密码(Shift Cipher),是以古罗马将军 Julius Caesar 的名字命名的,据说凯撒在军事通信中使用这种密码来加密敏感信息。

在战争期间使用这种加密方法来保护军事命令和机密信息,确保即使信息被截获,敌人也无法轻易破译,凯撒通常使用 N <= 25 位移位(即每个字母向后移 N <= 25 个位置)来加密消息。当消息被敌军获取了,敌军在不知道消息加密的方式情况下,只能得到一堆胡乱排列的字母。凯撒密码的数学公式为如下:

凯撒密码的核心原理是通信的双方有一个固定字母顺序表,以这个固定顺序的字母表作为消息加密的基础,通过将原本的消息进行移动位置的方式进行加密。凯撒密码易于破译,尤其是使用频率分析法,通过统计文本中各个字母出现的频率,可以很容易地推测出移位量并解密消息。比如,在加密文本中可以通过寻找加密文本中最常出现的字母来推断移位量,当找到这个字母偏移量就很容易破解出来密文信息了。

下面是通过 Java 自定义码表实现凯撒密码加密和解密逻辑:

public class CaesarCipher {

    private static final char[] ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();

    public static void main(String[] args) {
        String text = "HELLO";
        int shift = 3;

        String encrypted = encrypt(text, shift);
        String decrypted = decrypt(encrypted, shift);

        System.out.println("Original: " + text);
        System.out.println("Encrypted: " + encrypted);
        System.out.println("Decrypted: " + decrypted);
    }

    // 加密函数
    public static String encrypt(String text, int shift) {
        StringBuilder result = new StringBuilder();

        for (int i = 0; i < text.length(); i++) {
            char ch = text.charAt(i);

            if (Character.isUpperCase(ch)) {
                // 拿到对应字母的下标
                int originalPosition = findPosition(ch);
                // 找到偏移量之后字母下标,A 至 Z 之间循环
                int newPosition = (originalPosition + shift) % ALPHABET.length;
                result.append(ALPHABET[newPosition]);
            } else {
                result.append(ch); // 非字母字符不变
            }
        }

        return result.toString();
    }

    // 解密函数
    public static String decrypt(String text, int shift) {
        StringBuilder result = new StringBuilder();

        for (int i = 0; i < text.length(); i++) {
            char ch = text.charAt(i);

            if (Character.isUpperCase(ch)) {
                int originalPosition = findPosition(ch);
                int newPosition = (originalPosition - shift + ALPHABET.length) % ALPHABET.length;
                result.append(ALPHABET[newPosition]);
            } else {
                result.append(ch); // 非字母字符不变
            }
        }

        return result.toString();
    }

    // 查找字符在自定义码表中的位置
    private static int findPosition(char ch) {
        for (int i = 0; i < ALPHABET.length; i++) {
            if (ALPHABET[i] == ch) {
                return i;
            }
        }
        return -1; // 应该永远不会发生
    }
}

这种古代的加密方法,在现代计算机面前已经变得非常脆弱,凯撒密码只是在字母表上进行简单的移位操作,加密之后的密文与明文没有本质上的区别,只是信息的错位混淆处理。本质上密文依然是明文,现代计算机可以轻易地编写程序,快速破解这样的简单加密方式。

现代的程序员在存储用户密码时,通常使用 MD5 或者 SHA-1 等不可逆的哈希函数进行存储。这些哈希函数将密码转换成固定长度的哈希值,使得即使密码被窃取,也很难通过哈希值逆推出原始密码,这种方法存储的才是真正的密文。

通过将要传递的信息和语言文本信息通过特殊手段进行加密存储,消息在传递过程中能够达到通信完整性和机密性。实际上,这就是一种消息编码和解码的规则。类似于人类语言中使用中文交流的人,听不懂或看不懂用法语表示的语言信息,反之亦然。出现这种情况的原因是缺乏对方语言的编解码器。在计算机通信中,加密和解密的过程也是类似的问题。

如果两台计算机要通过网络进行安全通信,首先需要设计出一套双方能够理解并使用的编解码程序,任何第三者计算机都无法破解或知道编解码的规则。这是保证通信机密性和安全性的前提条件。只有在这个前提条件成立的情况下,通信双方的安全性才能得到保障。总结一下两台计算机在不可靠网络链通信要面临的 3 个问题:如何确认对方真实身份?如何保证数据不能被截获篡改?如何保证数据机密性?这是整个网络通信要面临和解决的问题?从这 3 个问题提取出来的,要保证通信安全的 3 个核心要素:机密性、完整性、可用性 ,换一种说法就是:防窃听 、防篡改 、防伪造 ,满足这些条件才能保证通信隐私安全性。


对称加密

在上面的 Caesar Cipher 故事中使用的是传统对称加密方式,只要密钥不被公开或被黑客窃取就能保证安全性。在现代的计算机中通常都是程序员或者用户设置一段固定长度字符串作为密钥,或者在程序运行期间动态生成一段随机字符串作为加密使用的密钥,这个密钥将被用于针对明文的数据块进行加密。常见的加密算法有 AESDES 算法,可以看作为是一个接收明文数据和密钥返回密文特殊函数,数学函数公式表示为 C=E(P,K) ,对称加解密过程如下图:

对称加密一般用于单体的应用或者本机运行的程序中,密钥一般都被存储在运行时的程序内存中,但也需要采取措施保护这些密钥。例如使用硬件安全模块(HSM)或者操作系统提供的安全存储机制(如 Windows 的 DPAPI 或 macOS 的 Keychain)来保护密钥。再者不要长时间使用一个固定的密钥,定期更换密钥,减少单个密钥被破解或泄露后造成的影响,实现自动化的密钥轮换机制,并确保旧密钥的数据能够正确迁移到新密钥上。


非对称加密

传统对称加密在密钥管理时会遇到如何防止加密密钥泄露的问题,导致对称密钥泄露的原因有很多,例如:密钥过于简单被黑客使用彩虹表攻击;或者将密钥明文硬编码在程序中,当程序被打包为二进制就连密钥一起被打包发布出去了,这样黑客可以通过反汇编技术查看到密钥。

另外一个问题就是非对称加密如果用于在互联网上的两台不同计算机通信,会出现一个问题,两台要进行通信的计算机要协商一个用于数据加密的密钥。如果密钥由互相通信两台计算机中一台生成,那么密钥就要通过网络先发送给另外一台计算机,但在互联网上传输的密钥是明文文本内容,在传输的过程中很有可能被其他的恶意的计算机所截获到密钥,此时就失去了加密通信的意义。

要建立安通的通信通道就要解决:机密性、完整性、可用性,这 3 个问题。目前计算机网络 OSI 标准中的会话层 TLS(Transport Layer Security)协议,它就是基于非对称加密来保证通信安全性。该协议的前身是网景公司的浏览器为了解决 HTTP 协议在通信过程中明文传输数据时,容易造成数据泄露的问题所开发出的 SSL 协议 (Security Socket Layer)。TLS 协议通过使用对称加密和非对称加密、数字证书和公钥基础设施(PKI),为应用层提供了安全的会话通信机制,开发者在实现安全通信时,通常可以直接利用现有的 TLS 实现来确保通信的安全性。

TLS 协议是 TCP/UDP 传输层的安全扩展,旨在确保传输层的数据传输安全。TLS 协议涉及到很多关于密码学和数学相关知识,它基于 RSA(Rivest-Shamir-Adleman)加密算法设计开发的,和传统对称加密解密所使用同一个密钥不同,它需要两个不同的密钥互相配合才能完整加解密的工作,分别为公钥和私钥,工作原理如下图:

非对称加密的密钥是一对密钥,由公钥和私钥组成,公钥用于加密数据,生成的密文只能通过对应的私钥进行解密,反之亦然。公钥和私钥之间存在数学上的强绑定关系,确保数据的加密和解密过程是安全。具体运作过程,公钥可以公开分发,而私钥则必须严格保密,以保证只有合法的私钥持有者能够解密通过公钥加密的数据,从而确保数据的保密性、完整性和发送者的身份认证。

TLS 的工作原理是首先使用非对称加密技术进行密钥交换,协商出一个用于当前会话的对称加密密钥,随后通信的数据报将通过这个对称密钥进行加密和解密。这样 TLS 协议不仅确保了数据的机密性,还有效地防止了中间人攻击在密钥交换过程中的威胁。TLS 依赖于非对称加密体系,在非对称加密体系中有一个严重容易忽略的问题就是,一对密钥中公钥都公开的,任何人都可以获取得到对方的公钥和使用对方公钥来加密数据发送给对方,这就使得任何人都可以冒充另外一个人的身份来使用公钥,对于解密方来说无非确定是谁使用了自己的公钥。


数字签名

为了确保通信数据的机密性,首先必须建立信任关系。在 TLS 协议中,使用了非对称加密的 RSA 算法,解决了加密与解密过程中的密钥分发问题。然而,尽管非对称加密在密钥传输上具有优势,它并没有解决公钥可能被伪造或冒充使用的问题。为防止这一风险,TLS 协议通常结合证书颁发机构(CA)来验证公钥的合法性,确保通信双方的身份真实可信。

信任关系的建立是保障通信安全的前提,要建立通信双方的信任关系,就要解决公钥公共使用的问题,自己公钥被谁使用了?接收到的数据包是谁使用了自己公钥?解决问题这个方法就是使用数字签名,数字签名原理和日常生活中的纸张上盖章一样。下图为数字签名工作原理:

实现使用不可逆向哈希函数对要发送的数据包进行哈希运算,生产这个数据包内容的摘要信息,也就是对应的哈希码。再使用自己的私钥对摘要信息进行加密,生成对应的密文(数字签名),将其和自定的公钥、数据文件内容打包发送给对方。对方收到数据包取出数据包中的公钥,对数据包中密文(数字签名)进行解密,获得到数据包内容的摘要信息,再使用相同哈希函数对数据包的内容进行哈希运算,得到哈希码,通过比对数字签名的摘要哈希码和本地运算计算出的哈希码来确定数据包真实性和完整性。


CA 签发证书

便宜 VPS vultr
最后修改:2024 年 09 月 17 日
如果觉得我的文章对你有用,请随意赞赏 🌹 谢谢 !