加密算法与随机数生成算法

使用安全可靠的加密算法和随机数生成算法

密钥管理

在密码学里有个基本原则:密码系统的安全性应该依赖于密钥的复杂性,而不是算法的保密性。

在安全领域里,选择一个足够安全的加密算法不是困难的事,难的是密钥管理。在密钥管理中常见的错误是,将密钥硬编码在代码里。硬编码的密钥容易泄露:

① 代码被广泛传播(开源软件,商业软件的二进制文件,逆向工程反编译)。安全方案:通过 Diffie-Hellman 交换密钥体系,生成公私密钥来完成密钥的分发。

② 软件开发团队的成员都能看到代码,从而获知密钥,如果人员流动性较大,则密钥的保密性无法保证。安全方案:改善密钥管理,限制代码读写权限等。

Web 应用中常见做法:将密钥(包括密码)保存在配置文件或数据库中,在使用时由程序读取并加载至内存。密钥所在的配置文件或数据库需要严格的控制访问权限,同时也要确保运维或 DBA 中具有访问权限的人员越少越好。在应用发布到生产环境时需要重新生成新的密钥或密码,以免与测试环境中使用的密钥相同。

密钥管理的主要目的是为了防止密钥从非正常渠道泄露。定期更换密钥是一种有效的做法。一个比较安全的密钥管理系统,可以将所有的密钥(包括敏感的配置文件)都集中保存在一个服务器或集群上,并通过 Web Service 的方式提供获取密钥的 API。每个 Web 应用在需要使用密钥时,通过带认证信息的 API 请求密钥管理系统,动态获取密钥。Web 应用不能呢把密钥写入本地文件中,只加载到内存。密钥集中管理降低了系统对密钥的耦合性,也有利于定期更换密钥。

使用可靠的伪随机数算法

伪随机数是通过一些数学算法生成的随机数,并非真正的随机数。密码学上的安全伪随机数是不可压缩的。对应的真随机数通常由物理系统产生,比如电压的波动、空中电磁波的噪声等。

安全的随机数生成算法:在 Java 中,可以使用 java.security.SecureRandom;在 Linux 中,可以使用 /dev/random 或者 /dev/urandom;在 PHP5.3.0 及之后的版本中,若支持 OpenSSL 扩展,也可以直接使用函数来生成( string openssl_random_pseudo_bytes(int $length [, bool &$scrypto_strong]) )

此外,从算法上可以通过多个随机数的组合来增加随机数的复杂性。比如给随机数使用 MD5 算法后再连接一个随机字符,然后再使用 MD5算法。

 

posted @ 2017-05-15 15:56  RickyShilx  阅读(6063)  评论(0编辑  收藏  举报