如何安全使用加密套件?-阿里云开发者社区

开发者社区> zealotke> 正文

如何安全使用加密套件?

简介:
+关注继续查看

如何安全使用加密套件?

对称加密

  1. 首选 Chacha20-Poly1305 和 AES-GCM 算法(AEAD类算法)
  2. 不支持 AES-GCM 或 Chacha20-Poly1305 的场景下使用 AES-CBC,避免 ECB、CTR、CFB、OBF 模式
  3. 避免64bit块加密算法,例如 blowfish、TEA 等
  4. 不要使用RC4
  5. 不要自行设计加密算法,除非你在密码学领域是整个行业公认的专家
  6. 不要多次循环加密,加密强度取决于加密算法、秘钥长度,以及正确的实现加密过程。循环加密对加密强度没有实际意义的帮助

原因

  1. Chacha20-Poly1305,AEAD类算法;绕开了目前所有已知的漏洞;面向移动互联网优化;ARM架构上性能更佳
  2. AES-GCM,AEAD类算法;TLS 1.3 draft主要的算法;工业标准;现代CPU有AES-GCM的硬件指令

对称秘钥长度

  1. 对称秘钥长度不能低于128 bit,也即16字节
  2. 长度超过256 bit的对称秘钥没有实际意义
  3. 对称加密、RSA、ECC三种不同类型的算法中,同样的秘钥长度安全性也不同,下面表格中列出来同样强度情况下,对应不同算法的秘钥长度
  4. 对称秘钥生成规则参考本文的 "随机数生成规范"
Symmetric Key Size
(bits)
RSA and DH Key Size
(bits)
Elliptic Curve Key Size
(bits)
80 160 1024
112 224 2048
128 256 3072
192 384 7680
256 521 15360

以上数据来自:https://www.globalsign.com/en/blog/elliptic-curve-cryptography/

AES-CBC实现注意事项

必须使用符合加密算法安全的随机数生成器,cryptographically strong random number generator (RNG):https://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator

  1. iv必须随机生成,不能固定;生成规则参考本文的 "随机数生成规范"
  2. 避免用秘钥代替iv
  3. 避免用 stdlib 系列伪随机数

随机数生成规范

随机生成的iv或者nonce要采用/dev/urandom生成,或者采用基于/dev/urandom实现的随机数生成器

  • 避免采用 stdlib 系列伪随机数
  • 避免 havaged,prngs,egd 等
  • 避免 /dev/random ,会因为熵池噪声数据不足而阻塞几秒甚至是十几秒,严重影响性能,参考:https://zh.wikipedia.org/zh-cn//dev/random

成熟的Library推荐

  1. iOS 可以采用 Randomization Services Reference:https://developer.apple.com/library/ios/documentation/Security/Reference/RandomizationReference/
  2. Android & 服务端Java可以使用 SecureRandom:https://docs.oracle.com/javase/7/docs/api/java/security/SecureRandom.html
  3. 其他场景:推荐使用libsodium库,或NaCL库封装,或者直接读取 /dev/urandom

非对称加密

建议椭圆曲线,避免RSA

主要考虑前向安全性、椭圆曲线性能,以及现代计算机对RSA攻击能力逐年提升

HMAC算法

使用SHA2类的算法:SHA-256,SHA-384,SHA-512,SHA512/256等

避免 SHA-1、MD5、MD6

加密库选择

  1. iOS:建议使用原生的 Common Crypto,来自 Apple 的建议:https://developer.apple.com/cryptography/ ;避免使用 OpenSSL,原因是 OpenSSL 接口不友好、漏洞频发、版本升级时向下兼容性不好
  2. Android:建议使用 javax.crypto,https://docs.oracle.com/javase/7/docs/api/javax/crypto/spec/package-summary.html
  3. PC & Mac: 优先使用libsodium和NaCL库;对应libsodium不支持的加密算法,考虑统一底层加密库,同时桌面版对包大小不敏感,可以使用OpenSSL

参考资料

  1. Apple Cryptographic Libraries: https://developer.apple.com/cryptography/
  2. javax.crypto: https://docs.oracle.com/javase/7/docs/api/javax/crypto/spec/package-summary.html
  3. 现代密码学实践指南[2015年]:https://blog.helong.info/blog/2015/06/05/modern-crypto/

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
iOS开发中 关于阿里云服务器的使用与安全策略 韩俊强的博客
使用背景:         云服务已经很多年了,早期没能加入使用云大军中的一员,后来后悔莫及。2015年记得当时没办法租用的虚拟主机三天两天挂了,导致我认认真真的考虑了一次,觉得还是要使用云服务器! 从免费的主机屋学习版到各种虚拟机的实验,再到之前是用300元左右买的别人的虚拟主机,空间有几G,感觉还行,正好又值他们搞活动,买两年送一年!预存还有返还!心动了,就没有任何考虑就预存了一千块! 开始的几个月感觉还行,速度什么的还过得去,就没去管网站的事了。
1255 0
MSSQL · 最佳实践 · 使用混合密钥实现列加密
摘要 在SQL Server安全系列专题的上两期月报分享中,我们分别分享了:如何使用对称密钥实现SQL Server列加密技术和使用非对称密钥加密方式实现SQL Server列加密。本期月报我们分享使用混合密钥加密方式实现SQL Server列加密技术,最大限度减少性能损失,最大程度保护用户数据安全。
1504 0
[Chromium]如何安全的使用PostTask
PostTask参数决策树 如何传递绑定的对象 官方的解释总是最权威,有疑问看这里或者直接看代码中的说明: bind_helpers.h.  传值方式 描述 this 或 对象指针 如果对象本身是一个RefCountedThread...
1195 0
Spring Security笔记:使用BCrypt算法加密存储登录密码
在前一节使用数据库进行用户认证(form login using database)里,我们学习了如何把“登录帐号、密码”存储在db中,但是密码都是明文存储的,显然不太讲究。这一节将学习如何使用spring security3新加入的bcrypt算法,将登录加密存储到db中,并正常通过验证。
1532 0
如何判断你是个牛×黑客:使用C#加密攻击载荷来绕过杀毒软件
本文讲的是如何判断你是个牛×黑客:使用C#加密攻击载荷来绕过杀毒软件,衡量一个成功黑客和一款牛×的恶意攻击软件的重要指标之一,就是看其能否绕过所有的杀毒软件。 不过万事万物都是个矛盾体,因为一旦一种很牛×的绕过技术被公之于众,那杀毒软件的公司就会对这种技术进行分析并找到应对之策。
1906 0
MSSQL - 最佳实践 - 使用SSL加密连接
--- title: MSSQL - 最佳实践 - 使用SSL加密连接 author: 风移 --- # 摘要 在SQL Server安全系列专题月报分享中,往期我们已经陆续分享了:[如何使用对称密钥实现SQL Server列加密技术](http://mysql.taobao.org/monthly/2018/08/03/)、[使用非对称密钥实现SQL Server列加密](http:/
2441 0
+关注
zealotke
一往无前的勇气和决心!
1
文章
4
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载