大师兄

加餐 | 模块五思考题解答

今天我会带你把《模块五:网络安全》中涉及的课后练习题,逐一讲解,并给出每个课时练习题的解题思路和答案。

练习题详解

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 文件。

总结

网络安全类知识不仅面试中经常考察,本身也属于非常实用的知识。在实际工作中,如果触碰了高危操作,很有可能给你个人或公司带来灾难。因此在架构一个系统,或者书写架构文档的时候,建议你拿出一个小节具体讨论安全问题。

学到这里,《计算机网络通关 29 讲》专栏的全部课程就结束了,简单总结一下。

  • 网络协议 TCP/IP/UDP 的重点是了解其中的关键原理,并在遇到问题的时候,你脑海里能有大致的解决思路和应对方案,比如建立多少连接?连接和线程是什么模型?

  • Web 技术是工作技能,需要你根据自己的工作类型详细了解完整的技术栈。

  • 网络编程部分和语言设计、操作系统等知识结合紧密,如果你想进一步理解 I/O、内存、磁盘等知识,可以学习我在拉勾教育平台推出的另一门《重学操作系统》专栏。

  • 最后,网络安全是高压线,工作中不容忽视,需要你加倍小心,谨慎处理。这里我嘱咐你两件事情:第一,技术岗位其实很容易违法,违法行为坚决不要做;第二,上线前要进行安全扫描,养成习惯。

这一讲就到这里,发现求知的乐趣,我是林䭽。感谢你学习本次课程,下一讲是本专栏的最后一篇内容,我想和你聊聊《未来需要怎样的工程师》,再见。