Skip to content

Cryptographic Right Answers备忘

Cryptographic Right Answers一些准则,遵守就好

数据加密

If you’re hiding information from users or the network.

推荐

  • KMS1
  • XSalsa20-Poly1305

避免

  • AES-CBC、单独使用的 AES-CTR
  • 64bit 分组的加密算法——尤其是 Blowfish
  • OFB 模式
  • RC4

对称密钥

you’re using cryptography.

推荐

256bit足已

避免

  • 超长密钥
  • 多重加密?
  • 128bit 密钥

对称签名

you’re securing an API, encrypting session cookies, or are encrypting user data but, against medical advice, not using an AEAD construction.

推荐

HMAC

避免

  • 自定义“密钥哈希”
  • HMAC-MD5、HMAC-SHA1
  • 复杂的多项式 MAC
  • 把哈希再加密
  • CRC

哈希算法

推荐

SHA-2(SHA-512/256)2够用,没必要SHA-3

避免

  • SHA-1
  • MD5/MD6

随机数生成

推荐

256bit from /dev/urandom

避免

  • 用户态的随机数生成器
  • OpenSSL 的 RNG
  • havaged
  • prngd
  • egd
  • /dev/random3

密钥存储

you accept passwords from users or, anywhere in your system, have human-intelligible secret keys. 这里强调的是用户密码可能被内部人员读取

推荐

按顺序依次:

  • scrypt
  • argon2
  • bcrypt
  • PBKDF2

避免

  • 构建复杂的密码哈希切换机制
  • SHA-3
  • 裸用(不加盐)SHA-2, SHA-1, MD5

非对称密钥

由于效率问题?一般用在异步或者离线场景

推荐

Nacl/libsodium 4库,不要用OpenSSL

避免

  • RSA
  • RSA-PKCS1v15
  • ElGamal

非对称签名

需要数据完整性+身份验证的场合:加密货币、签名、验证完整性真实性、消息

推荐

Ed25519(Nacl的默认实现)

避免

  • RSA,RSA-PKCS1v15
  • 尤其避免ECDSA、DSA
  • RSA

Diffie-Hellman

密钥协商

推荐

  • 优选Nacl,甚至不用关心Nacl具体做了啥
  • Curve25519备选

避免

  • DH
  • SRP
  • J-PAKE
  • 握手和协商
  • 仅使用块的密钥(block ciphers)协商方案
  • srand(time())。

参考

  • Noise Protocol Framework

网站安全

主要针对tls, https?

推荐

  • 优选AWS ALB/ELB
  • 不想花钱,OpenSSL + LetsEncrypt凑合

避免

  • 冷门的 TLS 库,如 PolarSSL、GnuTLS 和 MatrixSSL

客户端服务器通信

推荐

网站安全

  • AWS ALB/ELB
  • OpenSSL + LetsEncrypt凑合

避免

  • 设计自己的加密传输;
  • 使用 TLS 但采用默认配置,如curl5、IPSEC

在线备份

很稳,Tarsnap就够了

  • Tarsnap
  • PMAC-SIV-encrypted arc files to S3, save fingerprints of your backups to an ERC20-compatible blockchain

几篇Latacora 的文章


  1. AWS/Google的密钥托管+加解密服务 

  2. SHA-2是一族算法 

  3. random基于熵,熵不足会阻塞,随机数质量高,但速度较慢,适合高安全性、长期的密钥生成场景;urandom性能更好,永远不会阻塞,适合大多数常见的加密和随机数生成任务。现代系统中它已足够安全。 

  4. libsodium是基于Nacl的一个实现 

  5. 当使用 curl 进行 HTTPS 请求时,如果不正确配置,它可能会使用不安全的默认设置(如较弱的加密套件、无效的证书验证等),从而导致潜在的安全风险。