今天我会带你把《模块五:网络安全》中涉及的课后练习题,逐一讲解,并给出每个课时练习题的解题思路和答案。
练习题详解
19 | 网络安全概述:对称、非对称加密的区别是?
【问题】自己写一个程序实测下对称加密和非对称加密的性能差距。
【解答】以下是我用 Java 写的一段测试程序:
package test;
import com.github.javafaker.Faker;
import org.junit.Test;
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
public class RSA {
@Test
public void rsaEncode() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeySpecException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
var keyPairGen = KeyPairGenerator.getInstance("RSA");
var pair = keyPairGen.generateKeyPair();
var privateKey = pair.getPrivate().getEncoded();
var faker = new Faker();
var start = System.currentTimeMillis();
var keyFactory = KeyFactory.getInstance("RSA");
var keySpec = new PKCS8EncodedKeySpec(privateKey);
var key = keyFactory.generatePrivate(keySpec);
for(var i = 0; i < 10000; i++) {
var randomBytes = faker.shakespeare().asYouLikeItQuote().getBytes();
var cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, key);
var resultBytes = cipher.doFinal(randomBytes);
if(i % 100 == 0) {
System.out.format("%d/10000 done.\n", i);
}
}
System.out.format("time: %dms\n", System.currentTimeMillis() - start);
}
@Test
public void aesEncode() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
var keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
var key = keyGenerator.generateKey();
var faker = new Faker();
var ivBytes = new byte[16];
var start = System.currentTimeMillis();
for(var i = 0; i < 10000; i++) {
var randomBytes = faker.shakespeare().asYouLikeItQuote().getBytes();
var cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
new SecureRandom().nextBytes(ivBytes);
var iv = new IvParameterSpec(ivBytes);
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
var result = cipher.doFinal(randomBytes);
}
System.out.format("time: %dms\n", System.currentTimeMillis() - start);
}
}
其中用 RSA 非对称加密算法加密 10000 个莎士比亚书中的句子,用时在 11s 左右,而采用 AES 对称加密算法加密,用时在 400ms 左右。
20 | 信任链:为什么可以相信一个 HTTPS 网站?
【问题】如果公司要求你生成一个公私钥对,然后去证书机构申请证书,请问如果你丢失了这个公私钥对有什么危害?你要如何保护这个公私钥对?
【解答】先明说说为什么会有这个问题。网站拥有者向 CA 机构申请证书时,证书请求文件中只包含公钥,不包含私钥。 证书私钥由网站保存,证书请求文件提交给 CA 机构进行认证和签名后对外公开。而大部分公司都会规定:含有敏感信息的数据不能带出公司,比如只能存放在公司的笔记本、公司的网盘、公司的服务器上,但是显然对于存储证书的场景不适用。因为私钥太敏感了,有了私钥相当于可以解密用户发送给服务器的数据,泄漏的危害性非常大。
因此,此类证书文件通常不在办公电脑,或者公司网盘上备份。如果你自己的电脑中有备份,应该尽快删除。通常证书直接保存到安全级别较高的服务器上,只有需要使用证书的软件才能够访问。另外,如果外部的第三方服务需要用到私钥,比如 CDN,那么这里还会涉及一些特别的密钥分发技术,以及硬件加密技术,具体可以参考 Keyless SSL 和 Intel 的 QAT 方案。
21 | 攻防手段介绍:如何抵御 SYN 拒绝攻击?
【问题】哪些情况下你服务器的 /etc/passwd 文件会被黑客拿走?
【解答】比较常见的情形就是开发机器信息泄漏或者中毒成了肉鸡。很多同学的开发机器上都配置了到服务器跳板机的免密登录权限。如果开发机器上公钥泄漏,黑客就有可能登入跳板机。如果成了肉鸡,那么很多行为都可以远程操控,相当于黑客攻破了你公司的内网。
还有一种常见的情形和代码注入有些相似之处,比如说有一个获取配置文件的服务,用参数表示配置文件的名称,比如 /getfile/a.txt 代表取出代码路径某个相对目录的 a.txt。这个时候如果网站程序实现直接将参数作为文件路径的一部分,黑客可能会尝试使用 /getfile/../../../etc/passwd 去获取 /etc/passwd 文件。
总结
网络安全类知识不仅面试中经常考察,本身也属于非常实用的知识。在实际工作中,如果触碰了高危操作,很有可能给你个人或公司带来灾难。因此在架构一个系统,或者书写架构文档的时候,建议你拿出一个小节具体讨论安全问题。