文章目录
- VPN概念
- VPN类型
- 站点-站点VPN
- 客户端-站点VPN
- VPN的工作原理
- VPN职责
- 职责一:保密
- 完整性
- 认证
- PSK算法实现(献给大佬)
- PSK应用演示
- RSA算法实现(献给大佬)
- RSA应用演示:实现签名
- VPN两大框架
- VPN的误解
- VPN合法性及法律相关知识
- 总结
VPN概念
- VPN(Virtual privacte network)虚拟专用网络,本身不是为翻墙而生。
- 由于当时HTTPS还没有编入RFC,当时很多人上网使用的是HTTP协议,HTTP协议最大的缺点是明文传输,HTTP没有对数据进行加密规定。对于公司来说,明文传输信息风险太大。
- 最早的VPN技术协议pptp(点对点隧道协议)诞生于1996年,它通过建立虚拟的点对点连接来实现远程访问。PPTP可以在Internet上传输多种协议,如IP、IPX和NetBEUI。它的数据传输经过加密,可以确保数据的安全性。
- PPTP是一种相对简单且易于实现的VPN解决方案,可以在Windows、Mac OS和Linux等各种操作系统上使用,并且与许多路由器和防火墙兼容。然而,由于PPTP使用的加密算法已被证明不安全,现在已经不被推荐使用。取而代之的是更安全的VPN协议,如OpenVPN和L2TP/IPSec。
PPTP(Point-to-Point Tunneling Protocol)是一种用于虚拟专用网络(VPN)的协议。
- 直到2000年,VPN技术一直应用于企业内部。用于外地出差员工临时访问公司资料的数据库,或者外地分公司需要和公司总部共享信息, 传输调取资料,直接通过公共互联网很有可能造成信息泄露,被第三方所窃取,而VPN技术用于信息加密。
- RFC代表“Request for Comments”,是由互联网工程任务组(IETF)制定的标准文档。
- RFC是一种开放的、有争议的技术标准,其中提供了关于网络协议、过程、实践和方法的详细信息。
- RFC的主要目的是为了在技术社区之间共享信息和想法,以及促进协议的发展和标准化。RFC文档可以由任何人编写和提交,它们经常引用在互联网开发、设计和管理的过程中。
- 公共互联网相当于一个通道,而VPN相当于具有加密和解密功能的第二个通道,可以很好保证信息不被第三方截留,窃取
VPN类型
- VPN分为两种类型:站点-站点VPN,客户端-站点(远程登录VPN)。VPN的核心是数据在公用网络里面是加密状态。
站点-站点VPN
- 对站点意味着两端或者多端的地点相对固定,链接不间断,一个数据包发送到VPN集线器的时候,数据包上的源地址只会被更改为当前VPN集线器的地址,而目的地址只会被改为目的VPN集线器的地址,而且数据包会被加密。在中间人看来只是加密的数据在两个集线器之间进行传输,这样就隐藏了实际原地址和实际目标地址。(但是也不是绝对的安全)
客户端-站点VPN
- 远程登陆VPN,适合居家办公的情景,这种类型相对灵活,比较适合不需要长时间进行链接的方式,而且一般来说,这种类型的VPN可以用浏览器直接通信,也可以另外安装客户端软件。
- 远程登录VPN有全隧道和半隧道模式。如果你想把所有的网络数据都走公司网就全隧道,但是在家办公的肯定少不了摸鱼,所以一般很多人会选择伴随着模式。
VPN的工作原理
-
从技术上讲,普通人的网络活动几乎是透明化的,比如:我们要访问谷歌,首先需要在浏览器中输入谷歌的网址,然后这个数据请求会通过WiFi路由器传递到网络服务商,然后,由网络服务商通过DNS服务器解析谷歌的goole.com网址域名到谷歌的服务器,服务器就会将我们所需要的信息传到我们电脑浏览器上。
-
整个过程基本经过wifi路由器,网络服务商,谷歌服务的三个环节,而这个环节都能造成个人信息泄露。
-
在快餐店,咖啡厅,酒店这些地方使用公共网络发布信息就很容易被别人用第三方所截获或在网络服务商环节,他们可以看到更多的东西,例如:你访问的网站,访问时间,使用的的设备,ip地址和实际的地理位置,而这些信息也是网络服务商一项重要的利润来源。尽管各个网络服务商都声称他们有最严格的隐私保护条例,但是你还是会发现,针对行为习惯的广告一点也没有减少。有句话说的好,当你使用免费的服务实,实际上你就是最大的商品和利润本身
-
随着互联网电商的不断发展,我们现在掌握的绝大部分网站都采用了ssl ts的加密协议,就是https。现在如果你输入的网址是HTTP浏览器都不允许你正常连接,https的作用就是对我们和所访问的网站之间的通讯信息进行加密,例如你在购物网站上输入银行卡卡号,密码等信息,都会进行加密,这大大提高了访问网络的安全性,但尽管如此,我们访问网络的隐私性还是得不到保障。
-
在访问https网站的情况下,网络服务商虽然不能获取完整的网页浏览信息,但还是能知道你访问的网站,而VPN技术在尽可能的解决这方面的问题一旦使用了VPN数据的收发过程,就会变成VP客户端,wifi路由器,网络服务商,VPN服务器到网站或者应用的服务器。
- 首先,一旦有设备安装了VPN客户端,并开始启用,你从设备上发出的所有数据流量都会通过VPN加密处理,这样即便在公共场所接入了公共wifi,第三方也很难直接获取你的信息,因为发出的信息已经经过了加密处理。 网络服务商处,网络服务商只能看到一些加密过的数据,要去连接一个VPN服务器以及连接微信的时间和收费的vpn服务器的数据流量,但也仅限于此,然后这些加密过的数据会通过vpn服务器进行解密。VPN服务器通过dns域名解析,再将这些数据发送至要访问的网站服务器。针对要访问的网站VPN会隐藏你的真实ip地址,使用VPN代理服务器的ip地址,这样数据在路由器阶段,网络服务商阶段,网站服务器阶段都得到了安全和隐私的双重保护。
VPN职责
职责一:保密
- 加密就是为了保密,让数据不那么容器让人识破,加密需要使用到算法,常用的有AES,3DES,这两个算法的名字都有E,E表示encryption(加密)。
完整性
- 单纯的加密也不能完美的传输数据,毕竟黑客看不懂你的数据,也可能乱改你的数据,自己得不到也不让你得到,所以VPN的另一个职责就是保护数据完整性。
- VPN保证数据完整性使用的算法是HASH算法(HASH是一系列算法的总称)
- 哈希算法(Hash Algorithm)也被称为散列算法、摘要算法,是一种将任意长度的消息压缩到某一固定长度的算法。
哈希算法常用于数据完整性校验、密码等安全性方面,以及在搜索引擎索引和数据库索引中进行优化等方面。
哈希算法可以将任意长度的数据转变为固定长度的摘要信息,这个摘要信息被称为哈希值(Hash Value)或消息摘要(Message Digest)。常用的哈希算法有MD5、SHA-1、SHA-256等。
认证
- 最重要的是,要知道和自己沟通的是不是自己认识的,比如有人黑了员工的电脑使用VPN登录公司内部网怎么办?这就需要VPN的第三个职责,也就是认证。
- PSK和RSA算法都是密码学中常见的加密算法,但它们的应用场景和实现方式不同。
- PSK是指预共享密钥(Pre-Shared Key),是一种对称加密算法,也叫做共享密钥加密。在PSK加密中,发送方和接收方共享同一个加密密钥。在通信前,双方需要协商出密钥,然后使用该密钥进行加密和解密。PSK常用于保护网络通信或设备之间的通信。
- 举例:Java实现PSK算法
- Java标准库中的Cipher类来实现AES加密,其中pskEncrypt方法用于加密,pskDecrypt方法用于解密。在加密和解密时,我们需要使用相同的密钥,这里我们使用了一个简单的字符串作为密钥,实际中应该使用更加复杂和安全的密钥。
PSK算法实现(献给大佬)
/**PSK算法简单实现 */
import java.math.BigInteger; import java.util.Random;
public class PSK {
private BigInteger p; //质数p
private BigInteger q; //质数q
private BigInteger n; //n = p * q
private BigInteger phi; //欧拉函数φ(n) = (p-1) * (q-1)
private BigInteger e; //公钥e
private BigInteger d; //私钥d
public PSK(int numBits) {
//生成两个大质数p和q
p = new BigInteger(numBits, 100, new Random());
q = new BigInteger(numBits, 100, new Random());
//计算n和φ(n)
n = p.multiply(q);
phi = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE));
//选择公钥e,要求1 < e < φ(n)且e与φ(n)互质
do {
e = new BigInteger(2 * numBits, new Random());
} while ((e.compareTo(phi) != -1) || (e.gcd(phi).compareTo(BigInteger.ONE) != 0));
//计算私钥d,使得d与e模φ(n)同余
d = e.modInverse(phi);
}
//加密
public BigInteger encrypt(BigInteger message) {
return message.modPow(e, n);
}
//解密
public BigInteger decrypt(BigInteger encrypted) {
return encrypted.modPow(d, n);
}
public static void main(String[] args) {
PSK psk = new PSK(1024);
BigInteger message = new BigInteger("123456789");
BigInteger encrypted = psk.encrypt(message);
BigInteger decrypted = psk.decrypt(encrypted);
System.out.println("明文:" + message);
System.out.println("加密后:" + encrypted);
System.out.println("解密后:" + decrypted);
}
}
PSK应用演示
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class PSKExample {
public static void main(String[] args) throws Exception {
String message = "Hello, world!";
String key = "mysecretkey";
byte[] encrypted = pskEncrypt(message, key);
byte[] decrypted = pskDecrypt(encrypted, key);
System.out.println("Encrypted message: " + new String(encrypted));
System.out.println("Decrypted message: " + new String(decrypted));
}
/**
* 使用PSK算法对消息进行加密
*
* @param message 要加密的消息
* @param key 密钥
* @return 加密后的消息
* @throws Exception 加密异常
*/
public static byte[] pskEncrypt(String message, String key) throws Exception {
// 将密钥转换为SecretKeySpec对象,使用AES算法
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
// 创建Cipher对象,使用AES/ECB/PKCS5Padding加密模式
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
// 使用密钥初始化加密模式
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// 对消息进行加密并返回结果
return cipher.doFinal(message.getBytes("UTF-8"));
}
/**
* 使用PSK算法对消息进行解密
*
* @param encrypted 加密后的消息
* @param key 密钥
* @return 解密后的消息
* @throws Exception 解密异常
*/
public static byte[] pskDecrypt(byte[] encrypted, String key) throws Exception {
// 将密钥转换为SecretKeySpec对象,使用AES算法
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
// 创建Cipher对象,使用AES/ECB/PKCS5Padding加密模式
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
// 使用密钥初始化解密模式
cipher.init(Cipher.DECRYPT_MODE, secretKey);
// 对加密后的消息进行解密并返回结果
return cipher.doFinal(encrypted);
}
}
- RSA算法是一种非对称加密算法,也叫做公钥加密。在RSA加密中,发送方使用接收方的公钥进行加密,接收方使用自己的私钥进行解密。RSA算法主要用于数字签名和密钥协商等方面。在数字证书中,数字证书的签名就是用RSA算法完成的。另外,SSL/TLS协议中也常用RSA算法进行密钥协商,以保障通信双方的安全。
RSA算法实现(献给大佬)
import java.math.BigInteger;
import java.util.Random;
public class RSA {
private BigInteger p; //质数p
private BigInteger q; //质数q
private BigInteger n; //n = p * q
private BigInteger phi; //欧拉函数φ(n) = (p-1) * (q-1)
private BigInteger e; //公钥e
private BigInteger d; //私钥d
public RSA(int numBits) {
//生成两个大质数p和q
p = new BigInteger(numBits, 100, new Random());
q = new BigInteger(numBits, 100, new Random());
//计算n和φ(n)
n = p.multiply(q);
phi = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE));
//选择公钥e,要求1 < e < φ(n)且e与φ(n)互质
do {
e = new BigInteger(2 * numBits, new Random());
} while ((e.compareTo(phi) != -1) || (e.gcd(phi).compareTo(BigInteger.ONE) != 0));
//计算私钥d,使得d与e模φ(n)同余
d = e.modInverse(phi);
}
//加密
public BigInteger encrypt(BigInteger message) {
return message.modPow(e, n);
}
//解密
public BigInteger decrypt(BigInteger encrypted) {
return encrypted.modPow(d, n);
}
public static void main(String[] args) {
RSA rsa = new RSA(1024);
BigInteger message = new BigInteger("123456789");
BigInteger encrypted = rsa.encrypt(message);
BigInteger decrypted = rsa.decrypt(encrypted);
System.out.println("明文:" + message);
System.out.println("加密后:" + encrypted);
System.out.println("解密后:" + decrypted);
}
}
RSA应用演示:实现签名
- Java内置的RSA算法进行加密和解密,并添加了必要的注释以便其他开发者理解代码的作用和实现原理。其中,我们通过generateRSAKeyPair方法生成RSA密钥对,使用私钥对消息进行签名并通过公钥对签名进行验证。
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
public class RSAExample {
public static void main(String[] args) throws Exception {
// 生成RSA密钥对
KeyPair keyPair = generateRSAKeyPair();
// 获取公钥和私钥
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
// 原始消息
String message = "Hello, world!";
// 使用私钥对消息进行签名
byte[] signature = rsaSign(message.getBytes(), privateKey);
// 使用公钥对签名进行验证
boolean valid = rsaVerify(message.getBytes(), signature, publicKey);
// 输出签名结果
System.out.println("Signature: " + new String(signature));
// 输出验证结果
System.out.println("Valid: " + valid);
}
/**
* 生成RSA密钥对
*
* @return RSA密钥对
* @throws Exception 异常
*/
public static KeyPair generateRSAKeyPair() throws Exception {
// 创建KeyPairGenerator对象,使用RSA算法
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
// 初始化密钥大小为2048
keyPairGenerator.initialize(2048);
// 生成密钥对
return keyPairGenerator.generateKeyPair();
}
/**
* 使用私钥对消息进行签名
*
* @param message 要签名的消息
* @param privateKey 私钥
* @return 签名
* @throws Exception 异常
*/
public static byte[] rsaSign(byte[] message, PrivateKey privateKey) throws Exception {
// 创建Signature对象,使用SHA256withRSA算法
Signature signature = Signature.getInstance("SHA256withRSA");
// 使用私钥初始化Signature对象
signature.initSign(privateKey);
// 更新要签名的消息
signature.update(message);
// 对消息进行签名并返回结果
return signature.sign();
}
/**
* 使用公钥对签名进行验证
*
* @param message 原始消息
* @param signature 签名
* @param publicKey 公钥
* @return 验证结果
* @throws Exception 异常
*/
public static boolean rsaVerify(byte[] message, byte[] signature, PublicKey publicKey) throws Exception {
// 创建Signature对象,使用SHA256withRSA算法
Signature sig = Signature.getInstance("SHA256withRSA");
// 使用公钥初始化Signature对象
sig.initVerify(publicKey);
// 更新要验证的消息
sig.update(message);
// 对签名进行验证并返回结果
return sig.verify(signature);
}
}
- 总之,PSK和RSA算法都是重要的加密算法,但应用场景和实现方式不同。PSK主要用于对称加密场景,RSA算法主要用于非对称加密场景。
VPN两大框架
- 网络通信本来就是一堆协议组合而成的一堆协议,又可以组成一个框架,VPN主要用到两大框架IPSec和SSL/TLS,两大框架的名字都有着s,并不是超人的S,而是security的缩写。两大框架的内容复杂,但是核心是安全。
SSL(Secure Sockets Layer)和TLS(Transport Layer Security)是一种网络安全协议,用于在客户端和服务器之间提供加密通信。SSL最初由Netscape开发,后来被TLS取代。TLS是SSL的升级版,目前广泛应用于Web浏览器和服务器之间的安全通信。
SSL/TLS框架包括以下几个部分:
-
握手协议(Handshake Protocol):用于在客户端和服务器之间建立安全连接。在握手过程中,客户端和服务器协商加密算法、生成密钥、验证身份等。
-
记录协议(Record Protocol):用于在已建立的安全连接上传输数据。在传输数据之前,会将数据进行加密、压缩、添加MAC等处理。
-
密码套件(Cipher Suite):包含加密算法、密钥交换算法、MAC算法等。客户端和服务器在握手过程中协商使用哪种密码套件。
-
数字证书(Digital Certificate):用于验证服务器的身份。服务器必须提供数字证书,客户端在握手过程中验证数字证书的有效性。
-
会话(Session):用于在客户端和服务器之间保持连接状态。在握手过程中,会生成会话ID,客户端和服务器可以使用会话ID恢复之前的安全连接,避免重复握手过程。
-
安全参数(Security Parameters):包含加密密钥、MAC密钥、初始化向量等。在握手过程中,客户端和服务器协商安全参数。
- SSL/TLS框架的实现可以使用各种编程语言和库,如Java的JSSE、Python的ssl、OpenSSL等。开发人员可以根据自己的需求选择合适的实现方式。
IPSec(Internet Protocol Security)框架是一种用于保护IP数据包安全性的协议,可以提供数据的加密、认证、完整性保护等安全服务。IPSec可以在网络层提供安全保护,与应用程序无关,可以保护所有使用IP协议的应用程序。
IPSec框架包括以下几个部分:
-
安全关联(Security Association,SA):用于描述一组IPSec安全服务的参数,包括加密算法、认证算法、密钥等。
-
安全关联数据库(Security Association Database,SAD):用于存储安全关联。
-
安全策略数据库(Security Policy Database,SPD):用于存储安全策略,包括哪些数据包需要进行安全处理、如何进行安全处理等。
-
密钥管理协议(Key Management Protocol,KMP):用于协商和管理安全关联的密钥。
-
认证头(Authentication Header,AH):用于提供IP数据包的完整性保护和认证服务,但不提供加密服务。
-
封装安全负载(Encapsulating Security Payload,ESP):用于提供IP数据包的加密、完整性保护和认证服务。
- IPSec的实现可以使用各种编程语言和库,如Java的JCE、Python的pycrypto、OpenSSL等。开发人员可以根据自己的需求选择合适的实现方式。
- 为什么会需要用到这两个框架呢?
- SSL/TLS代表https的s,也就是我们浏览网页的时候用的SSL/TLS,所以客户端对站点这种类型的VPN一般就是使用SSL/TLS,毕竟有可以进行bp功能的浏览器,就可以了,非常方便。
- IPses对于两种VPN类型都适用,既可以用在客户端对站点VPN,也可以用在站点对站点vpn,不过多数是用在站点对站点VPN。
VPN的误解
- ISP是互联网服务提供商(Internet Service Provider),指提供互联网接入服务的公司或组织。ISP通过提供宽带、拨号、光纤、DSL等方式,向用户提供上网服务,使用户能够访问互联网并进行在线活动。ISP还可能提供其他服务,如电子邮件、网站托管、域名注册等。
- 首先目标地址被修改后的数据通过ISP(互联网服务提供商)通过ISP的网络发送到VPN服务器,然后VPN服务器再把数据解密发送到真实的服务器,你和VPN服务器之间就建立一个无形的通道,所以VPN代表Virtual Private Network.
- 这个过程中存在的风险:VPN可能会出卖你,将你真实访问的网站泄露,即使你的VPN不会出卖你,那在解析域名的时候,你就先问ISP某网站的地址了,有可能你设置的DNS服务器还是ISP提供的,这样ISP还是可以直到你想访问的网站
- 一般情况下,使用HTTPS访问网页是安全的,黑客虽然知道你在访问网站,但是无法获取你实际发送和访问的内容。
VPN合法性及法律相关知识
- 我国对于个人使用VPN是怎么规定的呢?没有建立翻墙信号,没有提供翻墙服务,就是去买的工具,没有取利益诱惑力,没有在境外网站上发表不当言论,不违法呢?
- 从司法实践来看的话,以浙江省2019年至2023年的处罚为例,结果显示,主要是集中在19年20年,因为翻墙(擅自建立使用非法进行国际联网)的处罚,大概有50多件。出发点标明的都没有盈利行为,已经构成了擅自建立使用非法定信道进行国际联网,最后都被公安处罚的。处罚的执行方式,包括当场训诫或者罚款1000元,并处以警告处分。(
有些小伙伴是不是开始担心害怕了呢)
- 翻墙是指绕过相应的ip封锁内容,过滤域名,劫持流量限制等,实现对网络内容的访问。在我国,网民所称的翻墙,一般是指绕开我们国家法律管制,浏览境外服务器的相关网页内容。比如使用VPN软件访问境外网站,只要你在国内使用了翻墙软件,无论你的目的是什么,都属于违法行为。我国明确规定计算机信息网络直接进行国际联网,必须使用国家公用电信网提供的国际出入口信道,任何单位和个人不得自行建立或者使用其他信道进行国际联网。
- 首先,从学术上看,包括很多专业技术人员和法律学者,他们都在共同努力的论证机械的使用《中华人民共和国计算机信息网络国际联网管理暂行规定第6条》是不规范的,因为从规定看必须是使用邮电部国家公用电信网提供的国际出入口信道 ,但是目前只有通过国内三大运营商,也就是移动,联通,电信,通过这三家申请的海外服务器对接服务才是合法行为,那么其他形式的翻墙都属于非法定性到了吗?按照这个解释,确实是这样子的。
- 但是这里的信道是物理信道,也就是说你自己去拉网线去外国才叫私自建立,那才是违法。VPN只是一个数据转包,规范条文和使用VPN访问境外网站是不一样的。(
看到这里是不是有些小伙伴开始侥幸了呢) - 可以看的出技术员们的努力,确实不能去生硬地照搬条文规定。但是在实践上看,公民个人用因为翻墙到底是不是违法,这个本身是没有明确的法律条文规定的,它们也只是很模糊的去使用。但是如果被行政处罚的话,可能不仅仅限于翻墙去浏览网页,还有其他的违法行为,导致最后被查处的,但是也不排除就是上个网浏览了网被抓的。
总结
- 作为一个普通的网民,我们应该认识到VPN的作用和重要性,同时也要明确合法使用VPN的必要性和迫切性。我们要积极呼吁大家,不要滥用VPN,不要违法翻墙,要遵守法律法规,保护个人隐私和信息安全。同时,我们也要支持政府加强网络监管,打击网络犯罪,维护网络安全和秩序。让我们共同努力,合理使用VPN,共建和谐、自由、安全的网络空间。