作者: 启鑫

  • 加密算法分类与特性详解

    加密算法是用于将可读数据(称为明文)转换为不可读数据(称为密文)的过程。这个过程旨在保护数据的机密性,防止未经授权的访问。加密算法在信息安全领域扮演着至关重要的角色,广泛应用于数据存储、网络通信、身份验证等各个方面。

    1. 对称加密算法 (Symmetric Cryptography)

    • 定义: 加密和解密使用相同的密钥。
    • 特点:
      • 速度快: 由于加解密过程相对简单,计算速度通常较快。
      • 密钥管理复杂: 通信双方必须在安全的情况下共享密钥,密钥的生成、分发、存储和更新都比较困难。
      • 安全性依赖于密钥: 一旦密钥泄露,所有加密的数据都将暴露。
    • 常见算法:
      • 高级加密标准 (AES): 目前最广泛使用的对称加密算法,被认为是安全且高效的标准。支持多种密钥长度(128位、192位、256位)。
      • 数据加密标准 (DES): 较早的对称加密算法,密钥长度较短(56位),现在已被认为不够安全,容易受到暴力破解。
      • 三重数据加密标准 (3DES): 为了增强DES的安全性而设计,通过对数据进行三次DES加密。虽然比DES更安全,但效率较低,逐渐被AES取代。
      • Blowfish 和 Twofish: 由Bruce Schneier设计的快速且安全的对称加密算法。
      • 流密码 (Stream Ciphers): 如RC4(虽然现在已被认为不安全)。流密码逐位或逐字节地加密数据。
      • 分组密码 (Block Ciphers): 如AES、DES、3DES、Blowfish等。分组密码将数据分成固定大小的块进行加密。

    2. 非对称加密算法 (Asymmetric Cryptography)

    • 定义: 加密和解密使用不同的密钥,通常是一对相关的密钥:公钥 (Public Key) 和 私钥 (Private Key)。
    • 特点:
      • 密钥管理相对简单: 公钥可以公开分发,私钥由持有者秘密保管。
      • 安全性高: 即使公钥被泄露,只要私钥不泄露,数据仍然安全。
      • 速度较慢: 相较于对称加密,非对称加密的计算复杂度更高,加解密速度较慢。
    • 常见算法:
      • RSA (Rivest–Shamir–Adleman): 最早且广泛使用的非对称加密算法之一,基于大素数分解的数学难题。常用于数字签名、密钥交换和数据加密。
      • 椭圆曲线密码学 (ECC): 基于椭圆曲线数学的非对称加密算法。在提供与RSA相当安全性的前提下,密钥长度更短,计算效率更高,尤其适用于移动设备和资源受限的环境。
      • Diffie-Hellman 密钥交换: 一种允许双方在不安全通道上安全地协商共享密钥的协议,本身不用于数据加密,但常与其他对称加密算法结合使用。

    3. 哈希函数 (Hash Functions)

    • 定义: 一种单向函数,将任意长度的输入数据(消息)转换为固定长度的输出(哈希值或消息摘要)。
    • 特点:
      • 单向性 (One-way): 从哈希值很难(计算上不可行)反向推导出原始输入数据。
      • 确定性 (Deterministic): 相同的输入始终产生相同的哈希值。
      • 雪崩效应 (Avalanche Effect): 输入的微小变化会导致输出的哈希值发生显著变化。
      • 抗碰撞性 (Collision Resistance): 找到两个不同的输入产生相同哈希值在计算上是困难的(强抗碰撞性)或非常困难的(弱抗碰撞性)。
    • 应用: 主要用于验证数据的完整性、数字签名、密码存储等,不用于数据加密。
    • 常见算法:
      • 安全散列算法 (SHA): 包括SHA-1(已被认为不安全)、SHA-2(如SHA-256、SHA-512)、SHA-3等。
      • 消息摘要算法 (MD): 如MD5(已被认为不安全)。

    选择建议

    应用场景推荐算法原因
    加密大量数据对称加密(如 AES)速度快,资源消耗小
    身份验证、密钥交换非对称加密(如 RSA、ECC)公钥体系更适合开放环境
    数据完整性校验哈希函数(如 SHA-256)快速验证内容是否被篡改
  • macOS 安装 nmap扫描工具

    Nmap (Network Mapper) 是一款强大且灵活的开源网络扫描和安全审计工具。它能够快速发现网络上的主机和服务,识别操作系统和软件版本,并能执行各种安全扫描以检测潜在的漏洞。凭借其广泛的功能和可定制性,nmap 被网络管理员、安全专业人员以及渗透测试人员广泛应用于网络发现、资产清点、安全弱点评估等多种场景。无论是简单的网络探测还是复杂的安全分析,nmap 都是一款不可或缺的利器。

    1. 下载和安装 nmap

    我们需要从 nmap 官方网站下载适用于 macOS 的安装包。

    https://nmap.org/dist/nmap-7.95.dmg

    你可以通过以下命令扫描本地网络中的一个设备:

    nmap 192.168.1.1

    如果在终端中能够成功执行 nmap 命令并看到扫描结果
    说明 nmap 的命令行工具已经成功安装。

    2. 解决 Zenmap 无法打开的问题

    安装后可能会遇到 Zenmap 图形界面无法打开的情况,使用下面的命令进行打开

    open -a Zenmap
  • 正则表达式入门指南:开启文本处理的魔法大门

    在日常的编程和数据处理中,我们经常面临复杂的文本操作需求:

    • 如何从海量文本中精准提取电子邮件地址?
    • 怎样快速验证用户输入的电话号码格式是否正确?
    • 如何批量替换文档中的特定日期格式?

    这些看似棘手的问题,都可以借助一种强大的文本模式匹配工具——正则表达式 (Regular Expression, Regex) 来优雅地解决。

    一、什么是正则表达式?

    正则表达式,通常简称为“正则”或“regex”,是一种用于描述字符串中字符组合规律的模式。它本质上是一套预定义的规则,通过这些规则,我们可以高效地在文本中进行搜索、匹配、提取、替换和验证等操作。

    正则表达式的应用范围极其广泛,几乎遍布所有主流的编程语言、文本编辑器和命令行工具,例如 JavaScript、Python、Java、C#,以及 VS Code、Sublime Text、grep、sed、Notepad++ 等。掌握正则表达式,无疑能极大地提升你的文本处理效率。

    二、正则表达式的基础语法

    正则表达式的核心在于其语法,它由普通字符和具有特殊含义的元字符组成。

    1. 普通字符 (Literals)

    最基础的构成部分是普通字符,它们在正则表达式中直接匹配自身。

    正则表达式匹配内容
    hello精确匹配 “hello”
    abc123精确匹配 “abc123”

    2. 元字符 (Metacharacters)

    元字符是正则表达式的灵魂,它们赋予了模式匹配的灵活性和强大的表达能力。理解并熟练运用元字符是掌握正则表达式的关键。

    符号含义示例
    .匹配任何单个字符(除了换行符,某些模式下可匹配)a.c 匹配 “abc”, “a1c”
    ^匹配字符串的开头^The 匹配以 “The” 开头的字符串
    $匹配字符串的结尾.com$ 匹配以 “.com” 结尾的字符串
    *匹配前一个元素零次或多次ab*c 匹配 “ac”, “abc”, “abbc”
    +匹配前一个元素一次或多次ab+c 匹配 “abc”, “abbc”,不匹配 “ac”
    ?匹配前一个元素零次或一次(即可选)colou?r 匹配 “color”, “colour”
    {n}匹配前一个元素恰好 n 次a{3} 匹配 “aaa”
    {n,}匹配前一个元素至少 n 次a{2,} 匹配 “aa”, “aaa”, …
    {n,m}匹配前一个元素至少 n 次,但不超过 m 次a{2,4} 匹配 “aa”, “aaa”, “aaaa”
    []匹配括号内的任意一个字符[aeiou] 匹配任意小写元音字母
    [^]匹配除了括号内字符之外的任意字符[^0-9] 匹配任何非数字字符
    |或(选择),匹配左右两边的任何一个模式
    ()分组,将括号内的模式视为一个整体,并可用于捕获匹配(ab)+ 匹配 “ab”, “abab”, …
    \转义字符,用于取消元字符的特殊含义,匹配其字面值\. 匹配一个句点 “.”

    3. 特殊字符序列

    为了简化常见的模式匹配,正则表达式提供了一些预定义的特殊字符序列:

    表达式含义等价于
    \d匹配任何数字[0-9]
    \D匹配任何非数字字符[^0-9]
    \s匹配任何空白字符(空格、制表符、换行符等)
    \S匹配任何非空白字符
    \w匹配任何单词字符(字母、数字、下划线)[a-zA-Z0-9_]
    \W匹配任何非单词字符[^a-zA-Z0-9_]
    \b匹配单词边界(例如,空格、标点符号、字符串开头/结尾)
    \B匹配非单词边界

    三、常见模式案例

    结合你提供的案例和更通用的模式:

    1. 匹配电子邮件地址

    [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
    • [a-zA-Z0-9._%+-]+: 匹配一个或多个字母、数字、下划线、点号、百分号、加号或减号(用户名部分)。
    • @: 匹配 “@” 符号。
    • [a-zA-Z0-9.-]+: 匹配一个或多个字母、数字、点号或减号(域名部分)。
    • \.: 匹配一个点号(需要转义)。
    • [a-zA-Z]{2,}: 匹配两个或多个字母(顶级域名部分,如 com, org, cn)。

    2. 匹配手机号

    ^1[3-9]\d{9}$
    • ^: 匹配字符串的开头。
    • 1[3-9]: 匹配以 “1” 开头,第二位数字是 3 到 9 的数字。
    • \d{9}: 匹配后面跟着的 9 位数字。
    • $: 匹配字符串的结尾。

    3. 匹配日期(常见格式:YYYY-MM-DD)

    \d{4}-\d{2}-\d{2}
    • \d{4}: 匹配四位数字(年份)。
    • -: 匹配连字符。
    • \d{2}: 匹配两位数字(月份或日期)。

    你还可以扩展匹配其他日期格式,例如 \d{4}/\d{2}/\d{2} 或 \d{2}/\d{2}/\d{4}。

    四、贪婪匹配与非贪婪匹配

    默认情况下,量词 (*, +, ?, {}) 是贪婪的 (greedy),它们会尽可能多地匹配字符。如果你希望它们尽可能少地匹配,可以使用非贪婪模式 (non-greedy),在量词后面加上 ?。

    • 例如,对于字符串 <p>Hello</p>World<p>Regex</p>:
      • \<p>.*\<\/p> (贪婪) 会匹配整个 <p>Hello</p>World<p>Regex</p>.
      • \<p>.*?\<\/p> (非贪婪) 会匹配 <p>Hello</p> 和 <p>Regex</p>.

    五、捕获组与非捕获组

    • (pattern): 捕获组会将括号内匹配到的文本存储起来,方便后续引用或提取。
    • (?:pattern): 非捕获组用于组合模式,但不存储匹配到的文本,可以提高效率。

    例如,要提取日期中的年、月、日:

    (\d{4})-(\d{2})-(\d{2})

    在匹配后,你可以通过捕获组的编号(通常从 1 开始)获取各个部分。

    六、前瞻和后顾断言 (Lookaround Assertions)

    这些是零宽度断言,它们匹配一个位置,而不是字符本身。

    • 正向前瞻 (Positive Lookahead): (?=pattern) 断言当前位置的后面必须紧跟着 pattern。
    • 负向前瞻 (Negative Lookahead): (?!pattern) 断言当前位置的后面不能紧跟着 pattern。
    • 正向后顾 (Positive Lookbehind): (?<=pattern) 断言当前位置的前面必须紧跟着 pattern。
    • 负向后顾 (Negative Lookbehind): (?<!pattern) 断言当前位置的前面不能紧跟着 pattern。

    例如,要匹配后面跟着 “USD” 的数字:\d+(?=USD)

    七、如何在不同环境中使用正则表达式

    Python 示例:

    import re
    
    text = "请联系我:[email protected] 和 [email protected]"
    pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
    
    results = re.findall(pattern, text)
    print(results)  # 输出 ['[email protected]', '[email protected]']

    在文本编辑器中使用:

    大多数现代文本编辑器都支持在查找和替换功能中使用正则表达式。你需要启用相应的选项(通常是一个 .* 图标或 “Use Regular Expression” 复选框)。

    八、学习建议与资源

    1. 在线测试工具:
      • Regex101:功能强大,可以实时查看匹配结果、解释正则表达式,并提供不同语言的代码示例。
      • RegExr:简洁易用,提供交互式的学习和测试环境。
    2. 练习题思路:
      • 提取网页信息: 从简单的 HTML 片段中提取所有的 <a> 标签的 href 属性值(链接)和标签内的文本(标题)。
      • 校验用户输入: 编写正则表达式来验证用户注册表单中的用户名(例如,只能包含字母、数字和下划线,长度在 6-20 个字符之间)、密码强度(例如,包含大小写字母、数字和特殊符号)。
      • 日志分析: 从服务器日志文件中提取特定时间范围内的所有 IP 地址或错误信息。
      • 数据清洗: 清理文本数据中的多余空格、特殊字符或HTML标签。
    3. 系统学习:
      • 查阅你所使用编程语言的正则表达式文档。
      • 阅读相关的在线教程和书籍。
      • 参与在线社区和论坛的讨论。

    正则表达式是一项极具价值的技能,虽然初学时可能会遇到一些挑战,但一旦掌握,它将成为你处理文本数据的强大助手。通过不断地学习和实践,你将能够灵活运用正则表达式解决各种复杂的文本处理任务,开启文本处理的魔法大门。

  • Multipass使用cloud-init 启动 Ubuntu 24.04 虚拟机

    使用 Multipass 启动一台基于 Ubuntu 24.04 的虚拟机,并通过 cloud-init.yaml 实现自动化配置。配置内容包括创建用户、禁用 root 和密码登录、启用 SSH 公钥认证,确保系统安全且易于远程管理。只需一条命令即可快速部署完成,非常适合开发和测试场景使用。

    1. 创建 cloud-config.yaml

    生成 SSH 密钥对(或准备好现有公钥):

    ssh-keygen -t ed25519 -C "liqixin@vm"

    公钥会保存在 ~/.ssh/id_ed25519.pub 中。

    创建一个名为 cloud-config.yaml 的文件:

    # cloud-config.yaml
    users:
      - name: liqixin
    sudo: ALL=(ALL) NOPASSWD:ALL
    shell: /bin/bash
    lock_passwd: true
    ssh_authorized_keys:
      - ssh-ed25519 AAAA liqixin@vm
    
    disable_root: true
    ssh_pwauth: false

    请把 ssh-ed25519 AAAA... 替换成你自己的公钥内容(~/.ssh/id_ed25519.pub 里的内容)。

    2. 启动 VM

    在 cloud-config 文件所在目录,运行以下命令:

    multipass launch 24.04 \
      --name liqixin-vm \
      --cpus 1 \
      --memory 1G \
      --disk 10G \
      --cloud-init cloud-config.yaml

    这会:

    • 下载 Ubuntu 24.04(首次执行会下载镜像)
    • 创建名为 liqixin-vm 的虚拟机
    • 启动时自动创建 liqixin 用户,并配置好免密 SSH 登录

    3. 通过 SSH 登录

    Multipass 默认会自动配置主机与 VM 的网络连接,你可以用以下方式连接:

    multipass info liqixin-vm

    输出中找到 IP 地址,例如:

    liqixin-vm:
      ...
      IPv4: 192.168.64.3

    然后用你的私钥直接 SSH 登录:

    ssh -i ~/.ssh/id_ed25519 [email protected]

    首次连接需要确认 fingerprint,之后就可以直接连了。

    4. 清理 / 删除 VM

    如果以后不需要这个 VM,可以这样清理:

    multipass delete liqixin-vm
    multipass purge
  • macOS 卸载Multipass虚拟机

    Multipass 虽然非常轻量,启动虚拟机的速度也很快,但由于不支持导入和导出虚拟机,对于有这类需求的用户来说并不适用。因此我决定卸载它。

    找了很久才找到卸载方法,最后在 GitHub 的 issues 区才找到正确方式,顺利卸载成功!以下是操作步骤:

    卸载步骤

    1. 打开 Terminal
    2. 执行以下命令开始卸载:
    sudo sh "/Library/Application Support/com.canonical.multipass/uninstall.sh"

    输入密码后等待卸载完成即可。

  • Intel Mac上安装windows11的方案

    由于 Windows 10 将在半年后终止支持,为了增加系统的可靠性,我们需要安装 Windows 11。

    Windows 10 终止支持信息:

    • Windows 10 将在 2025 年 10 月 14 日终止支持。
    • 当前版本 22H2 将是 Windows 10 的最终版本,所有版本在该日期前仍受支持,以获取每月安全更新。
    • 超过该日期后,现有 LTSC 版本将继续接收更新,具体取决于其特定的生命周期。

    准备工作:

    • Windows 镜像下载:
    • 根据您需要的语言,从以下链接下载 Windows 镜像:
    Windows 10:
    https://www.microsoft.com/en-us/software-download/windows10
    Windows 11:
    https://www.microsoft.com/en-us/software-download/windows11
    • 驱动下载:
    • 使用 macOS 的“启动转换助理”下载驱动。
    • U 盘准备:
    • 将下载好的文件复制到 U 盘中备用。
    • U 盘格式:NTFS、FAT32、exFAT 均可。

    安装步骤:

    由于“启动转换助理”目前仅支持 Windows 10 镜像,不支持 Windows 11 镜像,我们采用升级的方式进行安装。

    1. 在 Mac 上通过“启动转换助理”安装 Windows 10:
      • 设置分区大小,载入 Windows 10 镜像进行安装。
    2. 安装 Windows 11:
      • 在 Windows 10 系统中升级 Windows 11。
      • 由于 Mac 不支持 Windows 11,我们需要跳过 CPU 检测,强制安装。
      • 解压下载好的 Windows 11 镜像,执行以下命令跳过 CPU 检测:
    ./sources/setupprep.exe /product server
    • 保留文件,进行升级安装。
    • 等待安装完成。

    提示:

    • 全新安装会丢失驱动,需要通过扩展坞连接键盘鼠标进行安装。
    • 驱动需要从 macOS 的“启动转换助理”下载,复制到 Windows 中运行。
    • 请耐心等待安装完成。