继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

如何保存私密信息?

Java架构师讲师团
关注TA
已关注
手记 80
粉丝 4584
获赞 2541

大家好,我是姚半仙,慕课网《Java架构师成长直通车》课程架构师讲师团成员之一。这一篇文章中我们一起来探讨下配置管理的安全问题。

通常来说存储到配置文件里的大多都是一些并不敏感的业务数据,所以我们就光明正大地把明文放到GitHub中去了。如果要保存敏感的数据(比如说生产环境数据库的用户名和密码),并且需要通过配置管理的方式分发到服务节点,但又不能直接把密码放到GitHub,这时候应该怎么保护这些隐私数据的安全性呢?

图片描述

数据加密

前面提到的数据库密码是一个相当机密的信息,尽量不要让安全级别不高的个人或团队直接接触到。尽管我们程序猿们个个都是信得过的,不会随便登录生产环境做破坏性操作,可也不能保证突发事件的发生。比如今天我和产品经理干了一架,打输了,气不过,拿着密码登录生产环境删库跑路了。

我们需要引入一个数据安全机制,减少敏感数据的暴露程度,因此需要对三个环节做严格控制。

  • 数据加密端 就像颁发CA证书一样,必须由一个中心机构用密钥对明文进行加密。这里也一样,需要在生产环境中创建一个特定的服务,专门做加密操作。最重要的是,加密所用的秘钥只能保存在那台机器里,不能对外暴露
  • 数据存放端 数据存放端(如GitHub)只能保存加密过后的数据
  • 数据解密端 由于密钥都保存在数据加密端,因此数据解密和数据加密必须放在同一个地方进行,加密数据在传给客户端之前要经过解密,不能将秘钥下放到客户端机器上进行解密

我们接下来看一看Config是如何处理加密数据的

图片描述

  1. 数据加密 在进行加密之前,需要在Config的启动项中添加密钥信息。Config支持对称加密和非对称加密的方式,经由Config将明文加密为一串密文,然后我们将加密后的字符串提交到GitHub上。加密这一步可以通过HTTP POST方式将未加密的明文提交到Config服务下的“/encrypt”路径(如:localhost:60001/encrypt,明文放在BODY中),调用成功后Config会返回加密字符串
    • 在保存到Github的时候,需要在加密数据前面添加{cipher}标识,告诉Config这是一段加密存储的信息,例如以下配置描述了password属性对应的加密数据:
      password:{cipher}69f734a8f0994f77a104c0bd4856d3e8e753b52
  2. 服务端解密 当服务发起请求从Config拉取数据的时候,如果远程属性包含标识头{cipher},将被Config视为加密信息(这就是一种约定大于配置的设计思想),Config将使用密钥对属性进行解密后再返回明文给客户端

密钥的种类

前面我们提到了两种密钥,这里就多介绍两句

对称密钥

对称加密算法要求发送者和接收者在进行信息交换之前,商定一个密钥,即加密和解密两步都使用同一个密钥来进行。如果大家上学的时候选修过密码学就会知道,对称加密算法运算速度快,比较高效。不过有个潜在的风险存在,其密钥只能分发给绝对信任的Client(授信服务),否则任何获得密钥的人都可以使用该密钥进行通信。

非对称密钥

非对称加密算法需要生成一个密钥对,包括公钥和私钥,它们是成对出现的,就像一把锁和一把钥匙,只有特定的钥匙才能开启对应的锁。公钥用来对信息进行加密,使用对应的私钥进行解密。非对称算法强度复杂,加解密速度没有对称秘钥快,但是它解决了秘钥分发的安全性问题。

拿老师负责的项目举例,其中有一个交易对账功能,服务A将交易数据发给服务B,服务B再返回处理结果到A。首先他们要协商出两对公钥和私钥(A和B各有一对不同的密钥对),A和B这时互相交换公钥,当A给B发送数据的时候,使用B提供的公钥进行加密,B使用自己保留的私钥对A发来的数据进行解密。反过来也一样,B使用A提供的公钥对处理结果进行加密之后再发给A,A收到B发来的数据后使用自己的私钥来解密。

为了方便演示和简化流程,我们在课程中使用的是对称密钥的加密方式。同学们可以自己花点时间做一个非对称加密的小demo,从Config配置上来说和对称密钥的配置方式稍有不同,并且需要生成私钥。

非对称加密的公钥是公开的吗?

很多同学看到“公钥”会以为这个是公开的,这个说法只说对了一半。首先公钥也是密钥的一部分,它所谓的“公开”是针对授信访问者来说的,也就是说,在授信访问者的圈子里,它是公开的。假如你的服务可以被任何人调用,那么这个授信访问者就是everybody,这个公钥便成了真正的无限制公开;假如你的应用只能被指定的几个服务调用,那就只能将这些公钥分发给指定服务,对你而言除了这几个授信服务以外的应用都不应该拿到这个公钥。

图片描述

老师举一个真实的案例来说明这个问题:在18年的时候,腾讯向某地公安机构报案,声称其服务器被非法入侵。经过一系列的侦查,发现有一家颇具规模的技术公司通过反编译的手段反编了微信的安卓安装包,之后又从安装包内找到了信息传输的公钥和微信通讯协议的规则。这家公司将这个公钥集成到了自己的app里,用相同的通讯协议向腾讯服务器发起各种服务请求,将自己的app打造成了微信的“代理”。由于在通信过程中使用的是真实的公钥,腾讯服务器也把它当做了授信访问者。殊不知,这个“公钥”只是腾讯发给微信这个授信app的,他人盗取公钥的行为实际上已经触犯了法律,而这家公司的相关负责人也被检查机关以“非法入侵计算机系统罪”提起公诉。

有时我们在学习或者工作的时候会有这种感觉,好像也没做什么事,这一天就这么过去了。如果你也有这种感觉,我给大家两个提高产出的小建议,不妨试试看有没有用:

  1. 化整为零:把时间归整,在一段时间内(比如一小时)尽量只专注做一件事情,不要被零散的琐碎事情打断
  2. 事前计划:不是指提前设定大计划,而是开始做一件事情之前给自己一个心理暗示。比如说我在写这篇图文的时候会给自己定3小时的完成时间,这样你的潜意识会在这个过程中调整你的效率。
打开App,阅读手记
4人推荐
发表评论
随时随地看视频慕课网APP