精华内容
下载资源
问答
  • 思否主页:... 笔记 2019 年本讲的内容为与 2020 年的普通,标题为 安全与隐私,更注重于计算机用户可以如何增强隐私保护和安全 相关课程:计算机系统安全 (6.858) 相关课程:密码学 (6.857以及.

    https://missing.csail.mit.edu/
    https://missing-semester-cn.github.io/
    https://www.bilibili.com/video/BV14E411J7n2

    思否主页:https://segmentfault.com/u/wine99

    笔记

    (Entropy) 度量了不确定性并可以用来决定密码的强度。

    熵的单位是 比特 。对于一个均匀分布的随机离散变量,熵等于 log_2(所有可能的个数,即 n)。 扔一次硬币的熵是1比特。掷一次(六面)骰子的熵大约为2.58比特。

    使用多少比特的熵取决于应用的威胁模型。大约40比特的熵足以对抗在线穷举攻击(受限于网络速度和应用认证机制)。而对于离线穷举攻击(主要受限于计算速度),一般需要更强的密码 (比如80比特或更多)。

    散列函数

    密码散列函数 (Cryptographic hash function) 可以将任意大小的数据映射为一个固定大小的输出。散列函数具有如下特性:

    • 确定性(deterministic):对于不变的输入永远有相同的输出。
    • 不可逆性(non-invertible):对于hash(m) = h,难以通过已知的输出h来计算出原始输入m
    • 目标碰撞抵抗性/弱无碰撞(target collision resistant):对于一个给定输入m_1,难以找到m_2 != m_1hash(m_1) = hash(m_2)
    • 碰撞抵抗性/强无碰撞(collision resistant):难以找到一组满足hash(m_1) = hash(m_2)的输入m_1, m_2(该性质严格强于目标碰撞抵抗性)。

    SHA-1是Git中使用的一种散列函数,Linux 下有 sha1sum 工具。

    虽然SHA-1还可以用于特定用途,但它已经不再被认为是一个强密码散列函数。参照密码散列函数的生命周期这个表格了解一些散列函数是何时被发现弱点及破解的。

    密码散列函数的应用

    • Git中的内容寻址存储(Content addressed storage):散列函数是一个宽泛的概念(存在非密码学的散列函数),那么Git为什么要特意使用密码散列函数?
      • 普通的散列函数没有无碰撞性,Git 使用密码散列函数,来确保分布式版本控制系统中的两个不同数据不会有相同的摘要信息(例如两个内容不同的 commit 不应该有相同的哈希值)。
    • 文件的信息摘要(Message digest):例如下载文件时,对比下载下来的文件的哈希值和官方公布的哈希值是否相同来判断文件是否损坏或者被篡改。
    • 承诺机制(Commitment scheme):假设你要猜我在脑海中想的一个随机数字,我先告诉你该数字的哈希值,然后你猜数字,我再告诉你正确答案,看你是否猜对,这时你可以通过先前公布的哈希值来确认我没有作弊。

    密钥生成函数

    密钥生成函数 (Key Derivation Functions)与密码散列函数类似,用以产生一个固定长度的密钥。但是为了对抗穷举法攻击,密钥生成函数通常较慢。

    密码生成函数的应用

    • 将其结果作为其他加密算法的密钥,例如对称加密算法
    • 数据库中保存的用户密码为密文
      • 针对每个用户随机生成一个,并存储盐,以及密钥生成函数对连接了盐的明文密码生成的哈希值 KDF(password + salt)
      • 在验证登录请求时,使用输入的密码连接存储的盐重新计算哈希值KDF(input + salt),并与存储的哈希值对比。
      • (Salt),在密码学中,是指在散列之前将散列内容(例如:密码)的任意固定位置插入特定的字符串。这个在散列中加入字符串的方式称为“加盐”。
      • 在大部分情况,盐是不需要保密的。
      • 通常情况下,当字段经过散列处理,会生成一段散列值,而散列后的值一般是无法通过特定算法得到原始字段的。但是某些情况,比如一个大型的彩虹表,通过在表中搜索该SHA-1值,很有可能在极短的时间内找到该散列值对应的真实字段内容。
      • 加盐可以避免用户的短密码被彩虹表破解,也可以保护在不同网站使用相同密码的用户。

    对称加密

    keygen() -> key  (这是一个随机方法,例如使用 KDF(passphrase))
    
    encrypt(plaintext: array<byte>, key) -> array<byte>  (输出密文)
    decrypt(ciphertext: array<byte>, key) -> array<byte>  (输出明文)
    

    加密方法encrypt()输出的密文ciphertext很难在不知道key的情况下得出明文plaintext

    AES 是现在常用的一种对称加密系统。在 Linux 下可以使用 openssl 工具:

    openssl aes-256-cbc -salt -in {源文件名} -out {加密文件名}
    openssl aes-256-cbc -d -in {加密文件名} -out {解密文件名}
    

    非对称加密

    非对称加密的“非对称”代表在其环境中,使用两个具有不同功能的密钥: 一个是私钥(private key),不向外公布;另一个是公钥(public key),公布公钥不像公布对称加密的共享密钥那样可能影响加密体系的安全性。

    keygen() -> (public key, private key)  (这是一个随机方法)
    
    encrypt(plaintext: array<byte>, public key) -> array<byte>  (输出密文)
    decrypt(ciphertext: array<byte>, private key) -> array<byte>  (输出明文)
    
    sign(message: array<byte>, private key) -> array<byte>  (生成签名)
    verify(message: array<byte>, signature: array<byte>, public key) -> bool  (验证签名是否是由和这个公钥相关的私钥生成的)
    

    非对称的加密/解密方法和对称的加密/解密方法有类似的特征。
    信息在非对称加密中使用 公钥 加密, 且输出的密文很难在不知道 私钥 的情况下得出明文。

    在不知道 私钥 的情况下,不管需要签名的信息为何,很难计算出一个可以使 verify(message, signature, public key) 返回为真的签名。

    非对称加密的应用

    • PGP电子邮件加密:用户可以将所使用的公钥在线发布,比如:PGP密钥服务器或 Keybase。任何人都可以向他们发送加密的电子邮件。
    • 聊天加密:像 SignalTelegramKeybase 使用非对称密钥来建立私密聊天。
    • 软件签名:Git 支持用户对提交(commit)和标签(tag)进行GPG签名。任何人都可以使用软件开发者公布的签名公钥验证下载的已签名软件。

    密钥分发

    非对称加密面对的主要挑战是,如何分发公钥并对应现实世界中存在的人或组织。

    • Signal的信任模型:信任用户第一次使用时给出的身份(trust on first use),支持线下(out-of-band)面对面交换公钥(Signal里的safety number)。
    • PGP使用的是信任网络
    • Keybase主要使用社交网络证明 (social proof)

    案例分析

    • 密码管理器
    • 两步验证(2FA)(多重身份验证 MFA)
      • 要求用户同时使用密码(“你知道的信息”)和一个身份验证器(“你拥有的物品”,比如YubiKey)来消除密码泄露或者钓鱼攻击的威胁。
    • 全盘加密
      • 对笔记本电脑的硬盘进行全盘加密是防止因设备丢失而信息泄露的简单且有效方法。
      • Linux的 cryptsetup + LUKS
      • Windows的 BitLocker
      • macOS的 FileVault
    • 聊天加密
      • 获取联系人的公钥非常关键。为了保证安全性,应使用线下方式验证用户公钥,或者信任用户提供的社交网络证明。
    • SSH
      • ssh-keygen 命令会生成一个非对称密钥对。公钥最终会被分发,它可以直接明文存储。但是为了防止泄露,私钥必须加密存储。
      • ssh-keygen 命令会提示用户输入一个密码,并将它输入 KDF 产生一个密钥。最终,ssh-keygen 使用对称加密算法和这个密钥加密私钥。
      • 当服务器已知用户的公钥(存储在.ssh/authorized_keys文件中),尝试连接的客户端可以使用非对称签名来证明用户的身份——这便是挑战应答方式。 简单来说,服务器选择一个随机数字发送给客户端。客户端使用用户私钥对这个数字信息签名后返回服务器。服务器随后使用保存的用户公钥来验证返回的信息是否由所对应的私钥所签名。这种验证方式可以有效证明试图登录的用户持有所需的私钥。

    课后练习

    1. Entropy = log_2(100000^5) = 83
    2. Entropy = log_2((26+26+10)^8) = 48
    3. 第一个更强。
    4. 分别需要 31.7 万亿年和 692 年。

    非对称加密

    1. ssh-keygen -r ed25519 -o -C "your_email"
      生成 SSH 公钥
      How To Set Up SSH Keys
    2. How To Use GPG to Encrypt and Sign Messages
      GPG入门教程
    3. 给Anish发送一封加密的电子邮件(Anish的公钥)。
    4. git commit -S命令签名一个Git commit
      git show --show-signature命令验证 commit 的签名
      git tag -s命令签名一个Git标签
      git tag -v命令验证标签的签名
      对提交签名
    展开全文
  • (该系列文章大部分内容来源于MIT课程笔记,加入了个人的理解、原笔记中...这一讲我们将关注比如散列函数、密钥生成函数、对称/非对称密码体系这些安全和密码学的概念是如何应用于前几节课所学到的工具(Git和SSH)中的

    (该系列文章大部分内容来源于MIT课程笔记,加入了个人的理解、原笔记中没有的细节和其他的需要理解的内容,公开课地址:https://www.bilibili.com/video/BV14E411J7n2?p=1

    上一讲:元编程
    下一讲:大杂烩



    这一讲我们将关注比如散列函数、密钥生成函数、对称/非对称密码体系这些安全和密码学的概念是如何应用于前几节课所学到的工具(Git和SSH)中的。 如果你不是密码学的专家,请不要试图创造或者修改加密算法

    (Entropy) 度量了不确定性并可以用来决定密码的强度。

    在这里插入图片描述

    正如上面的 XKCD 漫画 所描述的, “correcthorsebatterystaple” 这个密码比 “Tr0ub4dor&3” 更安全——可是熵是如何量化安全性的呢?

    熵的单位是 比特。对于一个 均匀分布的随机离散变量熵 = log_2(所有可能的个数,即n)。

    一般我们认为攻击者了解密码的模型(最小长度,最大长度,可能包含的字符种类等),但是不了解某个密码是如何随机选择的—— 比如掷骰子。

    使用多少比特的熵取决于应用的威胁模型。 上面的XKCD漫画告诉我们,大约40比特的熵足以对抗在线穷举攻击(受限于网络速度和应用认证机制)。 而对于离线穷举攻击(主要受限于计算速度), 一般需要更强的密码 (比如80比特或更多)。


    散列函数

    密码散列函数 (Cryptographic hash function) 可以将任意大小的数据映射为一个固定大小的输出。除此之外,还有一些其他特性。 一个散列函数的大概规范如下:

    hash(value: array<byte>) -> vector<byte, N>  (N对于该函数固定)
    

    SHA-1是Git中使用的一种散列函数, 它可以将任意大小的输入映射为一个160比特(可被40位十六进制数表示)的输出。 下面我们用sha1sum命令来测试SHA1对几个字符串的输出:

    $ printf 'hello' | sha1sum
    aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
    $ printf 'hello' | sha1sum
    aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
    $ printf 'Hello' | sha1sum 
    f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0
    

    抽象地讲,散列函数可以被认为是一个不可逆,且看上去随机(但具确定性)的函数 (这就是散列函数的理想模型)。 一个散列函数拥有以下特性:

    • 确定性:对于不变的输入永远有相同的输出。
    • 不可逆性:对于hash(m) = h,难以通过已知的输出h来计算出原始输入m
    • 目标碰撞抵抗性/弱无碰撞:对于一个给定输入m_1,难以找到m_2 != m_1hash(m_1) = hash(m_2)
    • 碰撞抵抗性/强无碰撞:难以找到一组满足hash(m_1) = hash(m_2)的输入m_1,m_2(该性质严格强于目标碰撞抵抗性)。

    注:虽然SHA-1还可以用于特定用途,但它已经不再被认为是一个强密码散列函数。 你可参照密码散列函数的生命周期这个表格了解一些散列函数是何时被发现弱点及破解的。

    密码散列函数的应用

    • Git中的内容寻址存储(Content addressed storage):散列函数是一个宽泛的概念(存在非密码学的散列函数),那么Git为什么要特意使用密码散列函数?抗冲突。

    • 文件的信息摘要(Message digest):像Linux ISO这样的软件可以从非官方的(有时不太可信的)镜像站下载,所以需要设法确认下载的软件和官方一致。 官方网站一般会在(指向镜像站的)下载链接旁边备注安装文件的哈希值。 用户从镜像站下载安装文件后可以对照公布的哈希值来确定安装文件没有被篡改。

    • 承诺机制(Commitment scheme): 假设我希望承诺一个值,但之后再透露它—— 比如在没有一个可信的、双方可见的硬币的情况下在我的脑海中公平的“扔一次硬币”。 我可以选择一个值r = random(),并和你分享它的哈希值h = sha256(r)。 这时你可以开始猜硬币的正反:我们一致同意偶数r代表正面,奇数r代表反面。 你猜完了以后,我告诉你值r的内容,得出胜负。同时你可以使用sha256(r)来检查我分享的哈希值h以确认我没有作弊。


    密钥生成函数

    密钥生成函数 (Key Derivation Functions) 作为密码散列函数的相关概念,被应用于包括生成固定长度,可以使用在其他密码算法中的密钥等方面。 为了对抗穷举法攻击,密钥生成函数通常较慢

    密钥生成函数的应用

    • 从密码生成可以在其他加密算法中使用的密钥,比如对称加密算法(见下)。
      存储登录凭证时不可直接存储明文密码。
    • 正确的方法是针对每个用户随机生成一个盐 salt = random(), 并存储盐,以及密钥生成函数对连接了盐的明文密码生成的哈希值KDF(password + salt),这样即使有多个人使用相同的密码,生成的密匙也会不同。
      在验证登录请求时,使用输入的密码连接存储的盐重新计算哈希值KDF(input + salt),并与存储的哈希值对比。

    对称加密

    说到加密,可能你会首先想到隐藏明文信息。对称加密使用以下几个方法来实现这个功能:

    keygen() -> key  (这是一个随机方法)
    
    encrypt(plaintext: array<byte>, key) -> array<byte>  (输出密文)
    decrypt(ciphertext: array<byte>, key) -> array<byte>  (输出明文)
    
    • 加密方法encrypt()输出的密文ciphertext很难在不知道key的情况下得出明文plaintext

    • 解密方法decrypt()有明显的正确性。因为功能要求给定密文及其密钥,解密方法必须输出明文:decrypt(encrypt(m, k), k) = m

    AES 是现在常用的一种对称加密系统。

    对称加密的应用

    • 加密不信任的云服务上存储的文件。对称加密和密钥生成函数配合起来,就可以使用密码加密文件: 将密码输入密钥生成函数生成密钥 key = KDF(passphrase),然后存储encrypt(file, key)。(通过密码输入生成密匙的好处在于不需要另外记住人很难记住的密匙)

    举例:通过openssl加密本地文件:

    # 被加密的文件明文
    LilHoedeMacBook-Pro➜  Downloads  ᐅ  cat plot.py 
    #!/usr/bin/env python
    import matplotlib
    import matplotlib.pyplot as plt
    import numpy as np
    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('-i', type=argparse.FileType('r'))
    parser.add_argument('-o')
    args = parser.parse_args()
    
    data = np.loadtxt(args.i)
    plt.plot(data[:, 0], data[:, 1])
    plt.savefig(args.o)
    
    # openssl加密
    LilHoedeMacBook-Pro➜  Downloads  ᐅ  openssl aes-256-cbc -salt -in plot.py -out plot.enc.py
    enter aes-256-cbc encryption password:
    Verifying - enter aes-256-cbc encryption password:
    
    # 输出暗文
    LilHoedeMacBook-Pro➜  Downloads  ᐅ  cat plot.enc.py 
    Salted__f??P*lnTV?;SP?G?]j?qH?.?ߟ??z?։@M?Yh????[$$9?BT?lqb?n3Ab?2??t?T`C?bx?????dmJˣ]8?f??YW6Υ?`???7?SpwA??'?P?}bw??V???????j??-V?3s_?-???M>?#????Bٮ???}??qҹ'5?? Zg??樏?-????j???p/?c)
                                    ??9"v??ȡ?Pi?u$?Cx?(g*g??RIZ?3?KuB??U??c??#d??BW?
                                  ?֜ĝO????A?y :o?d???{]?y?H??@????K?p??Z??7?k罒?g????S?n?O\#YΝ?b?%       
    
    # 解密
    LilHoedeMacBook-Pro➜  Downloads  ᐅ  openssl aes-256-cbc -d -in plot.enc.py -out plot.dec.py
    enter aes-256-cbc decryption password:
    
    # 输出解密后的明文
    LilHoedeMacBook-Pro➜  Downloads  ᐅ  cat plot.dec.py 
    #!/usr/bin/env python
    import matplotlib
    import matplotlib.pyplot as plt
    import numpy as np
    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('-i', type=argparse.FileType('r'))
    parser.add_argument('-o')
    args = parser.parse_args()
    
    data = np.loadtxt(args.i)
    plt.plot(data[:, 0], data[:, 1])
    plt.savefig(args.o)
    
    # 比较原文和解密后的内容
    LilHoedeMacBook-Pro➜  Downloads  ᐅ  cmp plot.py plot.dec.py 
    
    # 输出上一次命令的结果(0为成功,1为失败)
    LilHoedeMacBook-Pro➜  Downloads  ᐅ  echo $?
    0
    # 原文/密文/解密文都存在目录中
    LilHoedeMacBook-Pro➜  Downloads  ᐅ  ls plot.*
    plot.dec.py  plot.enc.py  plot.py
    

    非对称加密

    非对称加密的“非对称”代表在其环境中,使用两个具有不同功能的密钥: 一个是私钥(private key),不向外公布;另一个是公钥(public key),公布公钥不像公布对称加密的共享密钥那样可能影响加密体系的安全性。

    非对称加密使用以下几个方法来实现加密/解密(encrypt/decrypt),以及签名/验证(sign/verify):

    keygen() -> (public key, private key)  (这是一个随机方法)
    
    encrypt(plaintext: array<byte>, public key) -> array<byte>  (输出密文)
    decrypt(ciphertext: array<byte>, private key) -> array<byte>  (输出明文)
    
    sign(message: array<byte>, private key) -> array<byte>  (生成签名)
    verify(message: array<byte>, signature: array<byte>, public key) -> bool  (验证签名是否是由和这个公钥相关的私钥生成的)
    

    非对称的加密/解密方法和对称的加密/解密方法有类似的特征:

    • 信息在非对称加密中使用 公钥 加密, 且输出的密文很难在不知道 私钥 的情况下得出明文。
    • 解密方法decrypt()有明显的正确性。 给定密文及私钥,解密方法一定会输出明文: decrypt(encrypt(m, public key), private key) = m

    对称加密和非对称加密可以类比为机械锁。 对称加密就好比一个防盗门:只要是有钥匙的人都可以开门或者锁门。 非对称加密好比一个可以拿下来的挂锁。你可以把打开状态的挂锁(公钥)给任何一个人并保留唯一的钥匙(私钥)。这样他们将给你的信息装进盒子里并用这个挂锁锁上以后,只有你可以用保留的钥匙开锁。

    签名/验证方法具有和书面签名类似的特征:

    • 在不知道 私钥 的情况下,不管需要签名的信息为何,很难计算出一个可以使verify(message, signature, public key)返回为真的签名。

    • 对于使用私钥签名的信息,验证方法验证和私钥相对应的公钥时一定返回为真: verify(message, sign(message, private key), public key) = true

    非对称加密的应用

    • PGP电子邮件加密:用户可以将所使用的公钥在线发布,比如:PGP密钥服务器或 Keybase。任何人都可以向他们发送加密的电子邮件。
    • 聊天加密:像 SignalKeybase 使用非对称密钥来建立私密聊天。
    • 软件签名:Git 支持用户对提交(commit)和标签(tag)进行GPG签名。任何人都可以使用软件开发者公布的签名公钥验证下载的已签名软件。

    密钥分发

    非对称加密面对的主要挑战是,如何分发公钥并对应现实世界中存在的人或组织。

    Signal的信任模型是,信任用户第一次使用时给出的身份(trust on first use),同时支持用户线下(out-of-band)、面对面交换公钥(Signal里的safety number)。

    PGP使用的是信任网络。简单来说,如果我想加入一个信任网络,则必须让已经在信任网络中的成员对我进行线下验证,比如对比证件。验证无误后,信任网络的成员使用私钥对我的公钥进行签名。这样我就成为了信任网络的一部分。只要我使用签名过的公钥所对应的私钥就可以证明“我是我”。

    Keybase主要使用社交网络证明 (social proof),和一些别的精巧设计。

    每个信任模型有它们各自的优点:我们(讲师)更倾向于 Keybase 使用的模型。


    混合加密

    在实际实现中,总是将对称和非对称加密混合使用,提高了安全性,也部分优化了对称加密慢的问题(非对称加密较快):

    在这里插入图片描述


    案例分析

    密码管理器

    每个人都应该尝试使用密码管理器,比如KeePassXC

    密码管理器会帮助你对每个网站生成随机且复杂(表现为高熵)的密码,并使用你指定的主密码配合密钥生成函数来对称加密它们。

    你只需要记住一个复杂的主密码,密码管理器就可以生成很多复杂度高且不会重复使用的密码。密码管理器通过这种方式降低密码被猜出的可能,并减少网站信息泄露后对其他网站密码的威胁。

    两步验证(双因子验证)

    两步验证(2FA)要求用户同时使用密码(“你知道的信息”)和一个身份验证器(“你拥有的物品”,比如YubiKey)来消除密码泄露或者钓鱼攻击的威胁。

    全盘加密

    对笔记本电脑的硬盘进行全盘加密是防止因设备丢失而信息泄露的简单且有效方法。 Linux的cryptsetup + LUKS, Windows的BitLocker,或者macOS的FileVault都使用一个由密码保护的对称密钥来加密盘上的所有信息。

    聊天加密

    Signal和Keybase使用非对称加密对用户提供端到端(End-to-end)安全性。

    获取联系人的公钥非常关键。为了保证安全性,应使用线下方式验证Signal或者Keybase的用户公钥,或者信任Keybase用户提供的社交网络证明。

    SSH

    我们在之前的一堂课讨论了SSH和SSH密钥的使用。那么我们今天从密码学的角度来分析一下它们。

    当你运行ssh-keygen命令,它会生成一个非对称密钥对:公钥和私钥(public_key, private_key)。 生成过程中使用的随机数由系统提供的熵决定。这些熵可以来源于硬件事件(hardware events)等。 公钥最终会被分发,它可以直接明文存储。 但是为了防止泄露,私钥必须加密存储。ssh-keygen命令会提示用户输入一个密码,并将它输入密钥生成函数 产生一个密钥。最终,ssh-keygen使用对称加密算法和这个密钥加密私钥。

    在实际运用中,当服务器已知用户的公钥(存储在.ssh/authorized_keys文件中,一般在用户HOME目录下),尝试连接的客户端可以使用非对称签名来证明用户的身份——这便是挑战应答方式。 简单来说,服务器选择一个随机数字发送给客户端。客户端使用用户私钥对这个数字信息签名后返回服务器。 服务器随后使用.ssh/authorized_keys文件中存储的用户公钥来验证返回的信息是否由所对应的私钥所签名。这种验证方式可以有效证明试图登录的用户持有所需的私钥。


    课后练习

    1. 假设一个密码是从五个小写的单词拼接组成,每个单词都是从一个含有10万单词的字典中随机选择,且每个单词选中的概率相同。 一个符合这样构造的例子是correcthorsebatterystaple。这个密码有多少比特的熵?

    2. 假设另一个密码是用八个随机的大小写字母或数字组成。一个符合这样构造的例子是rg8Ql34g。这个密码又有多少比特的熵?

    3. 哪一个密码更强?

    4. 假设一个攻击者每秒可以尝试1万个密码,这个攻击者需要多久可以分别破解上述两个密码?

    密码散列函数

    Debian镜像站下载一个光盘映像(比如这个来自阿根廷镜像站的映像)。使用sha256sum命令对比下载映像的哈希值和官方Debian站公布的哈希值。如果你下载了上面的映像,官方公布的哈希值可以参考这个文件

    非对称加密

    1. 在你自己的电脑上使用更安全的ED25519算法生成一组SSH 密钥对。为了确保私钥不使用时的安全,一定使用密码加密你的私钥。
    2. 配置GPG
    3. 给Anish发送一封加密的电子邮件(Anish的公钥)。
    4. 使用git commit -C命令签名一个Git提交,并使用git show --show-signature命令验证这个提交的签名。或者,使用git tag -s命令签名一个Git标签,并使用git tag -v命令验证标签的签名。

    参考:
    https://missing-semester-cn.github.io/2020/security/

    展开全文
  • 我国中小学校安全事故频频发生,生命安全教育尚处于“说教式、表演式、零散式”的起步状态,中小学生对于安全预防与自我救护的技能缺失。从生命的视角,从体育的起源与本质出发,探索建立中小学教育中生命安全教育的长效...
  • 上一讲:安全和密码学 下一讲: 目录

    (该系列文章大部分内容来源于MIT课程笔记,加入了个人的理解、原笔记中没有的细节和其他的需要理解的内容,公开课地址:https://www.bilibili.com/video/BV14E411J7n2?p=1

    上一讲:安全和密码学
    下一讲:Q&A(Q&A由于博主没有太多其他的见解,所以直接引用MIT课程讲义)



    修改键位映射

    通常这个功能由在计算机上运行的软件实现。当某一个按键被按下,软件截获键盘发出的按键事件(keypress event)并使用另外一个事件取代。比如:

    • 将 Caps Lock 映射为 Ctrl 或者 Escape:Caps Lock 使用了键盘上一个非常方便的位置而它的功能却很少被用到,所以非常推荐这个修改;
    • 将 PrtSc 映射为播放/暂停:大部分操作系统支持播放/暂停键;
    • 交换 Ctrl 和 Meta 键(Windows 的徽标键或者 Mac 的 Command 键)。

    你也可以将键位映射为任意常用的指令。软件监听到特定的按键组合后会运行设定的脚本。甚至更复杂的修改也可以通过软件实现:

    • 映射按键顺序,比如:按 Shift 键五下切换大小写锁定;
    • 区别映射单点和长按,比如:单点 Caps Lock 映射为 Escape,而长按 Caps Lock 映射为 Ctrl;
    • 对不同的键盘或软件保存专用的映射配置。

    下面是一些修改键位映射的软件:


    守护进程

    大部分计算机都有一系列在后台保持运行,不需要用户手动运行或者交互的进程。这些进程就是守护进程(deamon)。以守护进程运行的程序名一般以 d 结尾,比如 SSH 服务端 sshd,用来监听传入的 SSH 连接请求并对用户进行鉴权。

    Linux 中的 systemd(the system daemon)是最常用的配置和运行守护进程的方法。运行 systemctl status 命令可以看到正在运行的所有守护进程。这里面有很多可能你没有见过,但是掌管了系统的核心部分的进程:管理网络、DNS解析、显示系统的图形界面等等。用户使用 systemctl 命令和systemd交互来enable(启用)、disable(禁用)、start(启动)、stop(停止)、restart(重启)、或者status(检查)配置好的守护进程及系统服务。

    systemd 提供了一个很方便的界面用于配置和启用新的守护进程或系统服务。下面的配置文件使用了守护进程来运行一个简单的 Python 程序。文件的内容非常直接所以我们不对它详细阐述。systemd 配置文件的详细指南可参见 freedesktop.org

    # /etc/systemd/system/myapp.service
    [Unit]
    # 配置文件描述
    Description=My Custom App
    # 在网络服务启动后启动该进程
    After=network.target
    
    [Service]
    # 运行该进程的用户
    User=foo
    # 运行该进程的用户组
    Group=foo
    # 运行该进程的根目录
    WorkingDirectory=/home/foo/projects/mydaemon
    # 开始该进程的命令
    ExecStart=/usr/bin/local/python3.7 app.py
    # 在出现错误时重启该进程
    Restart=on-failure
    
    [Install]
    # 相当于Windows的开机启动。即使GUI没有启动,该进程也会加载并运行
    WantedBy=multi-user.target
    # 如果该进程仅需要在GUI活动时运行,这里应写作:
    # WantedBy=graphical.target
    # graphical.target在multi-user.target的基础上运行和GUI相关的服务
    

    如果你只是想定期运行一些程序,可以直接使用 cron。它是一个系统内置的,用来执行定期任务的守护进程。


    FUSE

    现在的软件系统一般由很多模块化的组件构建而成。你使用的操作系统可以通过一系列共同的方式使用不同的文件系统上的相似功能。比如当你使用 touch 命令创建文件的时候,touch 使用系统调用(system call)向内核发出请求。内核再根据文件系统,调用特有的方法来创建文件。这里的问题是,UNIX 文件系统在传统上是以内核模块的形式实现,导致只有内核可以进行文件系统相关的调用。

    FUSE(用户空间文件系统)允许运行在用户空间上的程序实现文件系统调用,并将这些调用与内核接口联系起来。在实践中,这意味着用户可以在文件系统调用中实现任意功能。

    在这里插入图片描述

    FUSE 可以用于实现如:一个将所有文件系统操作都使用 SSH 转发到远程主机,由远程主机处理后返回结果到本地计算机的虚拟文件系统。这个文件系统里的文件虽然存储在远程主机,对于本地计算机上的软件而言和存储在本地别无二致。sshfs就是一个实现了这种功能的 FUSE 文件系统。

    一些有趣的 FUSE 文件系统包括:

    • sshfs:使用 SSH 连接在本地打开远程主机上的文件
    • rclone:将 Dropbox、Google Drive、Amazon S3、或者 Google Cloud Storage 一类的云存储服务挂载为本地文件系统
    • gocryptfs:覆盖在加密文件上的文件系统。文件以加密形式保存在磁盘里,但该文件系统挂载后用户可以直接从挂载点访问文件的明文
    • kbfs:分布式端到端加密文件系统。在这个文件系统里有私密(private),共享(shared),以及公开(public)三种类型的文件夹
    • borgbackup:方便用户浏览删除重复数据后的压缩加密备份

    备份

    任何没有备份的数据都可能在一个瞬间永远消失。复制数据很简单,但是可靠地备份数据很难。有效备份方案的几个核心特性是:版本控制删除重复数据,以及安全性

    3-2-1规则

    3-2-1规则是备份数据的一个通用规则:

    • 至少复制三分你的数据
    • 至少在两种不同介质或储存类型上保存
    • 至少一份离线(本地)数据

    备份不限制于备份在本地计算机上的文件。云端应用的重大发展使得我们很多的数据只存储在云端。当我们无法登录这些应用,在云端存储的网络邮件,社交网络上的照片,流媒体音乐播放列表,以及在线文档等等都会随之丢失,用户应该有这些数据的离线备份。

    版本控制

    首先,复制存储在同一个磁盘上的数据不是备份,因为这个磁盘是一个单点故障(single point of failure)。这个磁盘一旦出现问题,所有的数据都可能丢失。推荐的做法是将数据备份到不同的地点存储。

    同步方案也不是备份。即使方便如 Dropbox 或者 Google Drive,当数据在本地被抹除或者损坏,同步方案可能会把这些“更改”同步到云端。同理,像 RAID 这样的磁盘镜像方案也不是备份。它不能防止文件被意外删除、损坏、或者被勒索软件加密。

    对备份的数据实施版本控制保证了用户可以从任何记录过的历史版本中恢复数据。

    重复数据

    在备份中检测并删除重复数据,使其仅备份增量变化可以减少存储开销。为了减少重复数据并保持安全性, TarsnapBorgbase是两种商用途径,他们提供给用户两种密匙,一种是只允许追加,一种是替换(删除原有内容再添加),后者(可以删除的密匙)存储在用户本地,避免恶意软件的侵入而导致你的数据丢失。

    安全性

    在安全性方面,作为用户,你应该考虑别人需要有什么信息或者工具才可以访问或者完全删除你的数据及备份。由于第三方备份不是总是可以信任,你可以将你的数据加密之后再备份到第三方,目前很多第三方支持用户加密,除非得到你的密匙,否则服务器无法读取你的数据。最后一点,不要盲目信任备份方案,用户应该经常检查备份是否可以用来恢复数据。


    API(应用程序接口)

    关于如何使用计算机有效率地完成 本地 任务,我们这堂课已经介绍了很多方法。这些方法在互联网上其实也适用。大多数线上服务提供的 API(应用程序接口)让你可以通过编程方式来访问这些服务的数据。比如,美国国家气象局就提供了一个可以从 shell 中获取天气预报的 API。

    这些 API 大多具有类似的格式。它们的结构化 URL 通常使用 api.service.com 作为根路径,用户可以访问不同的子路径来访问需要调用的操作,以及添加查询参数使 API 返回符合查询参数条件的结果。

    以美国天气数据为例,为了获得某个地点的天气数据,你可以发送一个 GET 请求(比如使用curl)到https://api.weather.gov/points/42.3604,-71.094。返回中会包括一系列用于获取特定信息(比如小时预报、气象观察站信息等)的 URL。通常这些返回都是JSON格式,你可以使用jq等工具来选取需要的部分。

    有些需要认证的 API 通常要求用户在请求中加入某种私密令牌(secret token)来完成认证。请阅读你想访问的 API 所提供的文档来确定它请求的认证方式,但是其实大多数 API 都会使用 OAuth。OAuth 通过向用户提供一系列仅可用于该 API 特定功能的私密令牌进行校验。因为使用了有效 OAuth 令牌的请求在 API 看来就是用户本人发出的请求,所以请一定保管好这些私密令牌。否则其他人就可以冒用你的身份进行任何你可以在这个 API 上进行的操作。

    IFTTT 这个网站可以将很多 API 整合在一起,让某 API 发生的特定事件触发在其他 API 上执行的任务。IFTTT 的全称If This Then That 足以说明它的用法,比如在检测到用户的新推文后,自动发布在其他平台。


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

    命令行工具的用法千差万别,阅读 man 页面可以帮助你理解每种工具的用法。即便如此,下面我们将介绍一下命令行工具一些常见的共同功能。

    • 大部分工具支持 --help 或者类似的标志参数(flag)来显示它们的简略用法。
    • 会造成不可撤回操作的工具一般会提供“空运行”(dry run)标志参数,这样用户可以确认工具真实运行时会进行的操作。这些工具通常也会有“交互式”(interactive)标志参数,在执行每个不可撤回的操作前提示用户确认。
    • –version 或者 -V 标志参数可以让工具显示它的版本信息(对于提交软件问题报告非常重要)。
    lilhoe at LilHoedeMacBook-Pro in ~ 
    $ python3 -V       
    Python 3.8.1
    
    • 基本所有的工具支持使用 --verbose 或者 -v 标志参数来输出详细的运行信息。多次使用这个标志参数,比如 -vvv,可以让工具输出更详细的信息(经常用于调试)。
    • 很多工具支持 --quiet 标志参数来抑制除错误提示之外的其他输出。
    • 大多数工具中,使用 - 代替输入或者输出文件名意味着工具将从标准输入(standard input)获取所需内容,或者向标准输出(standard output)输出结果。
    • 会造成破坏性结果的工具一般默认进行非递归的操作,但是支持使用“递归”(recursive)标志函数(通常是 -r)。
    • 有的时候你可能需要向工具传入一个 看上去 像标志参数的普通参数,比如:
    • 使用 rm 删除一个叫 -r 的文件;
    • 在通过一个程序运行另一个程序的时候(ssh machine foo),向内层的程序(foo)传递一个标志参数。

      这时候你可以使用特殊参数 – 让某个程序 停止处理 – 后面出现的标志参数以及选项(以 - 开头的内容):
    • rm - - -r 会让 rm 将 -r 当作文件名;
    • ssh machine --for-ssh – foo --for-foo 的 – 会让 ssh 知道 --for-foo 不是 ssh 的标志参数。

    窗口管理器

    大部分人适应了 Windows、macOS、以及 Ubuntu 默认的“拖拽”式窗口管理器。这种堆叠式(floating/stacking)管理器只是窗口管理器中的一种。特别在 Linux 中,有很多种其他的管理器。

    平铺式(tiling)管理器就是一个常见的替代。顾名思义,平铺式管理器会把不同的窗口像贴瓷砖一样平铺在一起而不和其他窗口重叠。这和 tmux 管理终端窗口的方式类似。平铺式管理器按照写好的布局显示打开的窗口。如果只打开一个窗口,它会填满整个屏幕。新开一个窗口的时候,原来的窗口会缩小到比如三分之二或者三分之一的大小来腾出空间。打开更多的窗口会让已有的窗口进一步调整。平铺式管理器可以让你在完全不使用鼠标的情况下使用键盘切换、缩放、以及移动窗口。


    Virtual Private Network

    V*N(csdn检测为敏感词汇…) 现在非常火,但我们不清楚这是不是因为一些好的理由。你应该了解 V*N 能提供的功能和它的限制。使用了 V*N 的你对于互联网而言,最好的情况下也就是换了一个网络供应商(ISP)。所有你发出的流量看上去来源于 V*N 供应商的网络而不是你的“真实”地址,而你实际接入的网络只能看到加密的流量。

    虽然这听上去非常诱人,但是你应该知道使用 V*N 只是把原本对网络供应商的信任放在了 V*N 供应商那里——网络供应商 能看到的,V*N 供应商 也都能看到。如果相比网络供应商你更信任 V*N 供应商,那当然很好。反之,则连接V*N的价值不明确。机场的不加密公共热点确实不可以信任,但是在家庭网络环境里,这个差异就没有那么明显。

    你也应该了解现在大部分包含用户敏感信息的流量已经被 HTTPS 或者 TLS 加密。这种情况下你所处的网络环境是否“安全”不太重要:供应商只能看到你和哪些服务器在交谈,却不能看到你们交谈的内容。

    这一切的大前提都是“最好的情况”。曾经发生过 V*N 提供商错误使用弱加密或者直接禁用加密的先例。另外,有些恶意的或者带有投机心态的供应商会记录和你有关的所有流量,并很可能会将这些信息卖给第三方。找错一家 V*N 经常比一开始就不用 V*N 更危险。

    如果你也想自己配置一个 V*N,可以了解一下 WireGuard 以及 Algo


    Linux系统目录

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述


    Markdown

    在不使用 Word 或者 LaTeX 等复杂工具的情况下,你可以考虑使用 Markdown 这个轻量化的标记语言(markup language)。你可能已经见过 Markdown 或者它的一个变种。很多环境都支持并使用 Markdown 的一些子功能。

    Markdown 致力于将人们编写纯文本时的一些习惯标准化。比如:

    • 用*包围的文字表示强调(斜体),或者用**表示特别强调(粗体);
    • 以#开头的行是标题,#的数量表示标题的级别,比如:## 二级标题;
    • 以-开头代表一个无序列表的元素。一个数字加.(比如1.)代表一个有序列表元素;
    • 反引号 `(backtick)包围的文字会以代码字体显示。如果要显示一段代码,可以在每一行前加四个空格缩进,或者使用三个反引号包围整个代码片段:
      就像这样
      
    • 如果要添加超链接,将 需要显示 的文字用方括号包围,并在后面紧接着用圆括号包围链接:[显示文字](指向的链接)。

    Markdown 不仅容易上手,而且应用非常广泛。实际上本课程的课堂笔记和其他资料都是使用 Markdown 编写的。点击这个链接可以看到本页面的原始 Markdown 内容。


    Hammerspoon (macOS桌面自动化)

    Hammerspoon 是面向 macOS 的一个桌面自动化框架。它允许用户编写和操作系统功能挂钩的 Lua 脚本,从而与键盘、鼠标、窗口、文件系统等交互。

    下面是 Hammerspoon 的一些示例应用:

    • 绑定移动窗口到的特定位置的快捷键
    • 创建可以自动将窗口整理成特定布局的菜单栏按钮
    • 在你的个人电脑上,通过检测所连接的 WiFi 网络自动静音扬声器
    • 在你不小心拿了朋友的充电器时弹出警告

    从用户的角度,Hammerspoon 可以运行任意 Lua 代码,绑定菜单栏按钮、按键、或者事件。Hammerspoon 提供了一个全面的用于和系统交互的库,因此它能没有限制地实现任何功能。你可以从头编写自己的 Hammerspoon 配置,也可以结合别人公布的配置来满足自己的需求。

    资源


    开机引导以及 Live USB

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

    Live USB 是包含了完整操作系统的闪存盘。Live USB 的用途非常广泛,包括:

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

    Live USB 通过在闪存盘上 写入 操作系统的镜像制作,而写入不是单纯的往闪存盘上复制 .iso 文件。你可以使用 UNetbootin 、Rufus 等 Live USB 写入工具制作。


    Docker, Vagrant, VMs, Cloud, OpenStack

    虚拟机(Virtual Machine)以及如容器化(containerization)等工具可以帮助你模拟一个包括操作系统的完整计算机系统。虚拟机可以用于创建独立的测试或者开发环境,以及用作安全测试的沙盒。

    Vagrant 是一个构建和配置虚拟开发环境的工具。它支持用户在配置文件中写入比如操作系统、系统服务、需要安装的软件包等描述,然后使用 vagrant up 命令在各种环境(VirtualBox,KVM,Hyper-V等)中启动一个虚拟机。Docker 是一个使用容器化概念的类似工具。

    租用云端虚拟机可以享受以下资源的即时访问:

    • 便宜、常开、且有公共IP地址的虚拟机用来托管网站等服务
    • 有大量 CPU、磁盘、内存、以及 GPU 资源的虚拟机
    • 超出用户可以使用的物理主机数量的虚拟机
      相比物理主机的固定开支,虚拟机的开支一般按运行的时间计算。所以如果用户只需要在短时间内使用大量算力,租用1000台虚拟机运行几分钟明显更加划算。

    受欢迎的 VPS 服务商有 Amazon AWSGoogle Cloud,以及 DigitalOcean


    交互式记事本编程

    交互式记事本可以帮助开发者进行与运行结果交互等探索性的编程。现在最受欢迎的交互式记事本环境大概是 Jupyter。它的名字来源于所支持的三种核心语言:Julia、Python、R。Wolfram Mathematica 是另外一个常用于科学计算的优秀环境。


    GitHub

    GitHub 是最受欢迎的开源软件开发平台之一。我们课程中提到的很多工具,从 vim 添加链接描述Hammerspoon,都托管在 Github 上。向你每天使用的开源工具作出贡献其实很简单,下面是两种贡献者们经常使用的方法:

    • 创建一个议题(issue)。 议题可以用来反映软件运行的问题或者请求新的功能。创建议题并不需要创建者阅读或者编写代码,所以它是一个轻量化的贡献方式。高质量的问题报告对于开发者十分重要。在现有的议题发表评论也可以对项目的开发作出贡献。

    • 使用拉取请求(pull request)提交代码更改。由于涉及到阅读和编写代码,提交拉取请求总的来说比创建议题更加深入。拉取请求是请求别人把你自己的代码拉取(且合并)到他们的仓库里。很多开源项目仅允许认证的管理者管理项目代码,所以一般需要复刻(fork)这些项目的上游仓库(upstream repository),在你的 Github 账号下创建一个内容完全相同但是由你控制的复刻仓库。这样你就可以在这个复刻仓库自由创建新的分支并推送修复问题或者实现新功能的代码。完成修改以后再回到开源项目的 Github 页面创建一个拉取请求

    提交请求后,项目管理者会和你交流拉取请求里的代码并给出反馈。如果没有问题,你的代码会和上游仓库中的代码合并。很多大的开源项目会提供贡献指南,容易上手的议题,甚至专门的指导项目来帮助参与者熟悉这些项目。


    练习

    备份

    1. 如何备份你的邮箱账号?
    2. 选择一个你经常使用的网站,查看该网站用什么方式备份你的数据?通常已经有工具基于相应的API解决这一问题(例如youtube-dl)
    3. archive.org查看一个你使用多年的网站,看看它已经有多少个版本了?
    4. One way to efficiently implement deduplication is to use hardlinks. Whereas symbolic link (also called soft link) is a file that points to another file or folder, a hardlink is a exact copy of the pointer (it uses the same inode and points to the same place in the disk). Thus if the original file is removed a symlink stops working whereas a hard link doesn’t. However, hardlinks only work for files. Try using the command ln to create hard links and compare them to symlinks created with ln -s. (In macOS you will need to install the gnu coreutils or the hln package).

    参考:
    https://missing-semester-cn.github.io/2020/potpourri/

    展开全文
  • 安全无小事

    2020-01-06 09:28:09
    通过上周的安全教育学习,我更加深刻的感受到“安全”的重要性。 任何一起事故对企业及家庭都...生活中各种实例不再提及,这种案例太多了,无不折射出我们的安全教育缺失,我们安全管理的体系还是那么的脆弱!...

    通过上周的安全教育学习,我更加深刻的感受到“安全”的重要性。 

    任何一起事故对企业及家庭都是一种不可挽回的损失,对家庭、个人更是造成无法弥补的伤痛。

    安全意识应始终牢牢扎根在每个人的心中,让大家知道若责任心不到位就会酿成事故,正确认识到安全不是一个人的问题,而是你中有我,我中有你。

    生活中各种实例不再提及,这种案例太多了,无不折射出我们的安全教育的缺失,我们安全管理的体系还是那么的脆弱!

     “安全就是效益”,这种观点应根植于每个人(包括我自己)的心中。首先武装好自己;其次养成良好的安全意识,杜绝习惯麻木,不正确的不要随大流,敢于同身边的不安全行为较真儿;第三是勤于检查,及时发现隐患。安全就是人们在生活中,生命得到保证,身体免于伤害,财产免于损失。 

    让人人都来重视安全,时刻关注安全,将“安全”铭记心中,不折不扣地遵守,守安全之法,在这个社会完整的生存!让人人都清楚地认识对安全意识说不就是伤害自己、伤害他人,甚至走向死亡。

    不要抱有任何饶幸心理,因为,或许一次小小的不经意就会造成很大的伤害或损失,让自己及关心自己的人后悔莫及。如果我们每个人都能真正意识到这一点,那么我们的安全必能做得更好,我们个人就能在一个安全和谐的环境中幸福生活。

    展开全文
  • 在生产劳动领域,安全自律是安全意识的最高境界,也是企业安全文化建设的核心目标之一,安全自律意识的缺失是制约安全生产的最主要的因素之一,也是中国这类发展中国家安全生产事故突出的最大问题之一。通过规章制度建设...
  • 提出了从安全教育、管理制度建设、应急演练、队伍建设等方面对开放实验室进行有效的管理的方法。本研究填补了开放化学实验室在安全管理方法或内容上的缺失,为开放实验室的安全管理提供了科学依据。
  • 文章基于安全文化与事故之间的关系,提出发生事故的主要原因是由于文化的缺失,进一步探讨安全文化的"漏洞",认为只有认真践行安全文化,一切风险皆可控制,一切事故皆可预防。安全文化的核心是预防为主,因为它引导正确的...
  • 浅谈青少年网络安全

    2017-07-04 13:26:00
    青少年或许已经成为网络使用的主体...面对这些越来越聪明的低龄化网络使用者,阻断他们显然已经不可能了,因此网络安全管理中“教育”成为不可缺失的一环。 青少年网络安全已经成为世界各国普遍关注的问题。2006年英...
  • 人才的匮乏源于教育缺失。当前,我国的量子信息和新工科蓬勃发展,已具备将量子信息相关课程渗透到工科专业本科阶段的基本条件。在新工科教学思想的指导下,中国科学技术大学面向网络空间安全专业的本科生开设了...
  • 数据时代的到来给人们带来了前所未有的便利,人们在享受便利的同时也承受着个人隐私被曝光的风险要解决大数据时代带来的信息安全遭到侵害,对他人尊重的缺乏,个人及行业本身道德自律的缺失等挑战仅靠法律、技术手段...
  • 归根结底,这些做法都忽视了受众感受,缺失效果意识,导致常识教育的“脱靶”,很难真正达到走心入脑的作用。  类似的问题不仅是在“防诈骗”领域,在诸如交通安全、应急自救、防火避灾等领域,也同样存在常识普及...
  • 范一飞认为,当前电信网络新型违法犯罪中支付环节存在制度缺失、有章不循、监管不力、消费者宣传教育不到位等问题,相关单位要瞄准目标,重点解决。一是高度重视账户实名制。从增量开户防范和存量账户排查两个方面...
  • 认真分析各事故案例和到相关企业进行调研,发现一个共性的问题——事故预防与应急处置培训不完善、不充分,人员安全培训缺失或缺乏有效性等是事故发生的重要原因。目前我国各行业针对事故预防与应急处置培训教师、内容...
  • 文章目录报错和解决方法错误一:无法打开键:xxx错误二:代号1311错误类型,一些文件缺失错误三:安装文件损坏总结 报错和解决方法   之前安装过一次Acrobat,之前的Acrobat文件没有卸载干净,从某宝上面购买的...
  • 目前的人脸识别技术已经相对成熟,有各种商业解决方案和开源方案,国内人脸识别技术已经逐步在公共安全、金融、教育、医疗等多个领域显露出较好的应用前景; 海康威视是以视频为核心的智能物联网解决方案和大数据...
  • 保存在 EHR 系统中的患者数据是否具有许多优势是毫无争议的,例如:提供的医疗保健的安全和完整的文档、合作医疗保健提供者之间的交换、发票或报告的生成、教育、临床决策支持、支持临床路径、临床和其他研究再利用...
  • 其中CMS只起到一个抛砖引玉的作用,基于此框架和我的CMS系统上,可以解决移动APP后台服务、多媒体信息、O2O、电商平台、分销系统、企业办公系统、音乐播放、教育软件等领域的开发。。。。 WODECMS开源内容管理系统 ...
  • 尽我所知,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含为获得东南大学或其它教育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已...
  • 朴朴公司希望能以全新的商业模式,更高效快捷的仓储配送模式,致力于成为更快、更好、更多、更省的在线零售平台,带给消费者更好的消费体验,同时推动中国食品安全进程,成为一家让社会尊敬的互联网公司。...

空空如也

空空如也

1 2
收藏数 25
精华内容 10
关键字:

安全教育缺失