前言

这是本人观看该课程所做的第三部分的笔记,包含第9、10课的内容,水平有限,不一定全面。
课程链接:点击这里
中文讲义:点击这里

第9讲 - 安全和密码学

本节课主要是了解已经存在的东西。如果没有接受过正规的安全课程的培训,不要从事安全工作。如果不是密码学的专家,请不要试图创造或者修改加密算法。

熵是对随机性的一种度量,在确定密码强度时非常有用。
如何量化这些不同密码的安全性呢?可以测算密码的随机性即算出其中有多少比特的随机性。熵的单位是比特。对于一个均匀分布的随机离散变量,熵等于log_2(所有可能的个数,即n)。比如扔一次硬币的熵是1比特,掷一次骰子的熵大约为2.58比特。
需要多少熵值,取决于需要保护什么,比如收到网站加密保护的密码,大约四十个比特的熵可能就够了。如果担心离线攻击并且想要真正的安全,那么可能需要八十比特的熵。

哈希函数

SHA-1Git中使用的一种散列函数,它需要输入一些比特数据,且恰好会有160比特(转为40位16进制)的输出。总的来说,哈希函数是一种输出一个看似是随机数实际上具有确定性的值且难以逆推的函数。
SHA-1函数演示如下:
QQ20240131-211154.png

实际用途

  • Git中用于内容地址的存储。
  • 验证互联网上下载的文件(生成相同哈希的文件是几乎不可能存在的)。比如为了验证下载的 linux 镜像文件是否是恶意镜像,我们可以从官网上查看对应文件的哈希值与其进行比较。官网一般会在(指向镜像站的)下载链接旁边备注安装文件的哈希值。
  • 承诺机制。假如需要在没有硬币的情况下玩抛硬币,需要在其中一个人的脑海中想象抛出的硬币是正面还是反面,我们该怎么保证游戏的公平性?这时我们可以使用 hash 函数,规定奇数为正,偶数为反(相反同理),然后让抛硬币的人将想到的数通过哈希函数输出。这时我们得到了这个数的哈希值,然后再猜正面还是反面。猜测结束后由那个人告诉我们输入的具体值,让我们通过哈希函数去进行验证以确保是公平的。

密钥生成函数(KDF)

通常被应用于生成固定长度的输出用在其他密码算法中的密钥。密钥生成函数通常执行很慢(有意设置的),为了防止有人暴力破解所有的密码,比如数据库泄漏了几百万条密码,就需要减缓破译的速度。对于正常用户而言影响不大,因为我们只需要验证一个密码且执行很慢又不影响密码的验证。

对称加密

对称加密系统有几个不同的函数:

  • 密钥生成函数,这是个随机生成函数。通常接受一个口令。
  • 一对用于加密解密的函数,加密需要将明文(字节序列/数据)与密钥作为输入,输出所谓的密文。解密函数则需要输出密文和密钥,输出明文。

这三个函数有几个性质:

  • 只有拥有密钥,才能通过密文找出明文。
  • 如果通过密钥 k 加密信息 m ,然后使用相同的密钥解密该密文,将得到相同的信息 m 。

对称加密可用于加密不信任的云服务上存储的文件。

在将加密后的密码存入数据库之前,我们可以计算一个盐值,这是一个长的随机字符串,
然后将其以明文的形式附加到密码后面在进行哈希存储,然后把最终的哈希值存储在密码数据库中。

非对称加密

与对称加密不同的是,密钥生成函数生成一对密钥,一个叫公钥,一个叫私钥。加密函数接受公钥,然后输出密文。解密函数接受密文与私钥,并还原出明文。
任何人都可以在我的私钥未曝光的情况下使用我的公钥进行加密并传输密文给我,然后我可以使用私钥进行查看,这就是非对称性。
除了次之外,还有签名/验证函数。签名/验证函数具有和书面签名类似的特征。签名函数用于接受消息和私钥,然后生成一个签名。验证函数接受消息,签名以及公钥,返回一个布尔值用来判断签名是否正确。
签名/验证函数有以下特征:

  • 没有私钥很难伪造签名。
  • 显然正确的结果

实际用途

  • 电子邮件加密。
  • 聊天加密。
  • 软件签名。Git支持用户对提交和标签进行PGP签名。任何人都可以使用软件开发者公布的签名公钥验证下载的已签名软件。

第10讲 - 大杂烩

按键映射

我们鼓励使用键盘去代替鼠标以节省时间,最常见的就是修改键位映射,我们可以通过一些软件去实现这些功能,比如:

  • Caps Lock映射为 Ctrl 或者 Esc :Caps Lock使用了键盘上一个非常方便的位置但它的功能却很少被用到。
  • 设置组合键位,比如Ctrl+Shift+Enter用于打开一个新的浏览器界面,或者设置组合按键用于自动粘帖邮箱号、密码的等难以记忆的事物。
  • 区别映射单点和长按,比如:单点 Caps Lock 映射为 Esc,而长按 Caps Lock 映射为 Ctrl。
    软件推荐:
    Linux : xmodmap 或者 Autokey
    Windows : 控制面板,AutoHotkey 或者 SharpKeys

守护进程

当我们使用计算机时,有许多是在后台保持运行且不需要用户手动运行的进程,这些进程就是守护进程。以守护进程运行的程序名一般以 d 结尾,比如使用 ssh 连接到计算机时,接受方必须有 ssh 守护进程运行,否则无法通过 ssh 连接到该计算机。 ssh 守护进程称为 sshd ,用于监听传入的 SSH 连接请求并对用户进行鉴权。
Linux 中的系统守护进程是 systemd 。运行 systemctl status 命令可以看到正在运行的所有守护进程。

用户空间文件系统(FUSE)

FUSE 允许运行在用户空间上的程序实现文件系统调用,并将这些调用与内核接口联系起来。在实践中,这意味着用户可以在文件系统调用中实现任意功能。
示例:
sshfs:在一个 sshfs fuse 文件系统上,每当尝试创建,打开,读取,写入一个文件,它都会通过 ssh 连接到远程服务器执行操作,而不是在本地文件上执行操作。

备份

复制存储在同一个磁盘上的数据不是备份,因为这个磁盘是一个单点故障。这个磁盘一旦出现问题,所有的数据都可能丢失。放在家里的外置磁盘因为火灾、抢劫等原因可能会和源数据一起丢失,所以是一个弱备份。推荐的做法是将数据备份到不同的地点存储。
同步方案也不是备份。即使方便如 Dropbox 或者 Google Drive,当数据在本地被抹除或者损坏,同步方案可能会把这些“更改”同步到云端。同理,像 RAID 这样的磁盘镜像方案也不是备份。它不能防止文件被意外删除、损坏、或者被勒索软件加密。
不要盲目信任备份方案。用户应该经常检查备份是否可以用来恢复数据。
当我们将数据存放在云端时,应该做好云端数据的离线备份。

API

大多数线上服务提供的 API 让你可以通过编程方式来访问这些服务的数据。
这些 API 大多具有类似的格式。它们的结构化 URL 通常使用api.service.com作为根路径,用户可以访问不同的子路径来访问需要调用的操作,以及添加查询参数使 API 返回符合查询参数条件的结果。
通常发送请求到这些 API 后得到的返回数据都是JSON格式,你可以使用jq等工具来选取需要的部分。
有些需要认证的 API 要求用户在请求中加入私密令牌(也就是token)来完成认证。

常见命令行标志参数及模式

通常使用man命令就可以查看一个命令可以如何使用特定的命令,可以给它什么样的标志和选项。下面是一些命令的共同功能的介绍:

  • --help:来显示命令的简略用法。
  • --version:打印正在使用的软件版本。
  • --verbose:会让程序输出更详细的运行信息。
  • 使用-代替输入/输出文件名意味着工具将从标准输入获取所需内容/向标准输出输出结果。
  • 会造成破坏性结果的工具(比如rmcp)一般默认进行非递归的操作,但是支持使用递归标志函数(通常是 -r)。
  • --:用于停止处理其后面出现的标志参数以及选项(以 - 开头的内容),比如:
    • rm -- -i会让rm-i当作文件名

窗口管理器

我们习惯的堆叠式管理器(可以拖拽窗口、改变窗口位置、调整窗口大小等等)只是窗口管理器中的一种。特别在Linux中,有很多种其他的管理器。
平铺式管理器就是一个常见的替代,平铺式管理器按照写好的布局显示打开的窗口,比如只打开一个窗口,它会填满整个屏幕,新开一个窗口的时候,原来的窗口会缩小到比如三分之二或者三分之一的大小来腾出空间,打开更多的窗口会让已有的窗口进一步调整,但是所有的窗口会铺满整个屏幕。这和tmux管理终端窗口的方式类似。

VPN

我们应该意识到VPN能够做什么,不能做什么。最好的情况下,VPN也就是更改一下你的网络供应商,让你在互联网上的流量看起来在实际位置之外的某个地方的方法。
VPN的安全性是应该注意的一个问题,选择好的VPN十分重要。

开机引导以及 Live USB

在你的计算机启动时,BIOS或者UEFI会在加载操作系统之前对硬件系统进行初始化,这被称为引导。你可以通过按下计算机提示的键位组合来配置引导,比如Press F9 to configure BIOS.``Press F12 to enter boot menu。在BIOS菜单中你可以对硬件相关的设置进行更改,也可以在引导菜单中选择从硬盘以外的其他设备加载操作系统,比如Live USB(包含了完整操作系统的闪存盘)。
Live USB的用途非常广泛,包括:

  • 作为安装操作系统的启动盘
  • 在不将操作系统安装到硬盘的情况下,直接运行 Live USB 上的操作系统
  • 对硬盘上的相同操作系统进行修复
  • 恢复硬盘上的数据