密钥管理

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

在安全领域里,选择一个足够安全的加密算法不是困难的事情,难的是密钥管理。在一些实际的攻击案例中,直接攻击加密算法的案例很少,而因为密钥没有妥善管理导致的安全事件却很多。对于攻击者来说,他们不需要正面破解加密算法,如果能够通过一些方法获得密钥,则是件事半功倍的事情。

密钥管理中最常见的错误,就是将密钥因编码在代码里。比如下面这段代码,就将Hash过的密码硬编码在代码中用于验证。

public boolean VerifyAdmin(String password){
    if (password.equals("68af404b513073584c4b6f22b6c63e6b")){
        System.out.println("Entering Diagostic Mode...");
        return true;
    }
    System.out.pringln("Incorrect Password!");
    return false;

同样的,将加密密钥、签名的salt等“key”硬编码在代码中,是非常不好的习惯。

硬编码的密钥,在以下几种情况下可能被泄露。一是代码被广泛传播。这种泄露途径常见于一些开源软件;有的商业软件并不开源,但编译后的二进制文件被用户下载,也可能被逆向工程反编译后,泄露硬编码的密钥。二是软件开发团队的成员都能查看代码,从而获知硬编码的密钥。开发团队的成员如果流动性较大,则可能会由此泄露代码。

对于Web应用来说,常见的做法是将密钥(包括密码)保存在配置文件或者数据库中,在使用时由程序读出密钥并加载进内存。密钥所在的配置文件或数据库要严格的控制访问权限,同时也要确保运维或DBA中具有访问权限的人越少越好。

在应用发布到生产环境时,需要从新生成新的密钥或密码,以免与测试环境中使用的密钥相同。

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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值