PPTP(Point-to-Point Tunneling Protocol)是一种用于虚拟专用网络(VPN)的协议。
- RFC代表“Request for Comments”,是由互联网工程任务组(IETF)制定的标准文档。
- RFC是一种开放的、有争议的技术标准,其中提供了关于网络协议、过程、实践和方法的详细信息。
- RFC的主要目的是为了在技术社区之间共享信息和想法,以及促进协议的发展和标准化。RFC文档可以由任何人编写和提交,它们经常引用在互联网开发、设计和管理的过程中。
从技术上讲,普通人的网络活动几乎是透明化的,比如:我们要访问谷歌,首先需要在浏览器中输入谷歌的网址,然后这个数据请求会通过WiFi路由器传递到网络服务商,然后,由网络服务商通过DNS服务器解析谷歌的goole.com网址域名到谷歌的服务器,服务器就会将我们所需要的信息传到我们电脑浏览器上。
整个过程基本经过wifi路由器,网络服务商,谷歌服务的三个环节,而这个环节都能造成个人信息泄露。
在快餐店,咖啡厅,酒店这些地方使用公共网络发布信息就很容易被别人用第三方所截获或在网络服务商环节,他们可以看到更多的东西,例如:你访问的网站,访问时间,使用的的设备,ip地址和实际的地理位置,而这些信息也是网络服务商一项重要的利润来源。尽管各个网络服务商都声称他们有最严格的隐私保护条例,但是你还是会发现,针对行为习惯的广告一点也没有减少。有句话说的好,当你使用免费的服务实,实际上你就是最大的商品和利润本身
随着互联网电商的不断发展,我们现在掌握的绝大部分网站都采用了ssl ts的加密协议,就是https。现在如果你输入的网址是HTTP浏览器都不允许你正常连接,https的作用就是对我们和所访问的网站之间的通讯信息进行加密,例如你在购物网站上输入银行卡卡号,密码等信息,都会进行加密,这大大提高了访问网络的安全性,但尽管如此,我们访问网络的隐私性还是得不到保障。
在访问https网站的情况下,网络服务商虽然不能获取完整的网页浏览信息,但还是能知道你访问的网站,而VPN技术在尽可能的解决这方面的问题一旦使用了VPN数据的收发过程,就会变成VP客户端,wifi路由器,网络服务商,VPN服务器到网站或者应用的服务器。
/**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);
}
}
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);
}
}
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);
}
}
- 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);
}
}
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密钥、初始化向量等。在握手过程中,客户端和服务器协商安全参数。
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数据包的加密、完整性保护和认证服务。
- 是指绕过相应的ip封锁内容,过滤域名,劫持流量限制等,实现对网络内容的访问。在我国,网民所称的,一般是指绕开我们国家法律管制,浏览境外服务器的相关网页内容。比如使用VPN软件访问境外网站,只要你在国内使用了软件,无论你的目的是什么,都属于违法行为。我国明确规定计算机信息网络直接进行国际联网,必须使用国家公用电信网提供的国际出入口信道,任何单位和个人不得自行建立或者使用其他信道进行国际联网。