数据安全系列3:密码技术概述

传送门

数据安全系列1:开篇

数据安全系列2:单向散列函数概念

如何看待程序员工作很忙

最近2个月工作上任务很重很忙,导致压力也比较大,所以博客一直没有更新。今天查看草稿箱时,发现上一篇关于XXL-JOB源码的解析思路已经记不大清晰了,估计得又重头看下代码才行。正如古龙所说:"人在江湖,身不由己"!当时入软件这一行也没想太多,只想有一个份工作,忙忙碌碌这么多年有了个温饱,而工作模式还是没有太大改变,更多的时候还是别人让做什么就做什么

  • 做程序员的,产品出了原型,让你照着实现 
  • 做程序员的,安全说有漏洞,让你照着实现
  • 做程序员的,客户说有需求,让你照着实现
  • 做程序员的,领导说有调整,让你自己实现
  • ...

关于工作上如何应对压力,在知乎上看到一个方法,觉得有些道理,这里共享出来:

1、把公司当做学校

        把每天的工作都当作学习锻炼,由此获得收获,为更大的平台做储备

2、利用摸鱼时间充实自己

        给自己留出时间来提高自己,不要全部都投入工作中,这也是一种调节

3、打工的终极目标是跳槽或者变成合伙人

        打工的目的不仅是为了获取报酬,工资只是过程,终极目的是不再依靠工资而是发工资的那个人。这就要求对待工作不仅停留在自己的一亩三分地上面,一切可能需要用到的都可以涉及:项目管理、产品设计、客户沟通、交付、信息安全,甚至是法务、财务、法律合规

引自原文:工作不开心,辞职是唯一的出路吗?

这不仅仅是鸡汤,而是自我调节的一种方式(运动也能减压),否则长期处在高压条件下人有可能是会垮掉的,或者只能辞职了! 

什么是密码技术

引子-推荐书籍

在以往的文章里面很少谈到相关的技术书,因为现在网上的资料很多获取途径也很方便。但是对于安全类甚至是加解密技术来说,其实还算比较小众!生活中网络无处不在,随之而来的网络攻击、网络安全更是如影随形,平时使用的时候也不会刻意关注它,就算是很多应用开发工程师也不会太在意。所以安全领域的门槛还是很高的,作为一本入门书《图解密码技术_百度百科 》,私以为是是相当优秀的(我也只是看了一遍,远谈不上入门),有兴趣可以看看:概念清晰、通俗易懂!

那什么是密码技术?

一说到密码,最直接联想到的就是各种各样的"登录密码":qq、微信、淘宝、京东、银行卡、ATM机等,这里密码可作为一种身份的凭证(在有些场景也叫作口令、PING码),但是密码技术并不等于这里的用户密码,而是围绕它展开的一系列的密码技术!比如说下面几个问题:

  • 用户输入的密码要怎么安全的传输到系统后端?推而广之,要如何安全传递敏感信息?
  • 用户的密码要怎么安全的存储在系统里面?推而广之,要如何安全存储敏感数据?

要回答上面的问题,先从下面的例子展开!

假设用户为发送者Sender,它发出的所有请求内容称为消息Message,接收消息的系统为接收者Receiver。正常的消息发送流程如下:

  • 消息是从计算机A通过互联网发送到计算机B的,中间可能会经过许多设备 ,但是在正常情况下会顺利通信
  • 但是在恶意的网络环境下,消息可能被"偷看",也就是所谓的"窃听"

发送者肯定不希望别人看到发送的内容,在无法确定消息是能被窃听的情况下,发送者可以将消息加密(encrypt),这样即使窃听者获取拿消息,也因为"看不懂"而达到安全的效果!比如消息是:

这是发送者的密码

密钥为

123456789

用AES算法加密之后变成:

U2FsdGVkX1/p+GuY3TyXZuvRwaZgG7xOu70jJAHYmmU2GPFaIQZkrgBG+7U9dFk1

窃听者在不知道密钥的情况下,就无法解密出来原文了。在加密的过程中,原文称为"明文",而加密之后消息称为"密文",而加密的key称为"密钥"。上述流程就变成了下面的步骤:

密码技术保证了消息的机密性

在上述例子中通过加密(encrypt)手段,保证消息不被窃听者读取,这称为信息的机密性:

上面提到而加密的key称为"密钥"。密钥就像是现实生活中的钥匙,只有拥有这把钥匙才能开门,在密码算法中也只有通过密钥才能解密出加密的密文!

加密过程

解密过程

对称加密与非对称加密

上面这种加密、解密都用同一个密钥的使用方法,称为对称加密!

与之相反,加密、解密分别使用不同的密钥的方式,称为非对称加密,也叫公钥密码!

单向散列函数

前面通过"登录密码"讨论了数据加密应用,所以回到开始的2个问题,现在能否解答了呢?

问题1
  • 用户输入的密码要怎么安全的传输到系统后端?推而广之,要如何安全传递敏感信息?

可以采用加密的方案,将传输的内容进行加密,这样可以保证消息的机密性。所以在用户登录的场景中,可以将用户密码加密之后,再传输到后端(不过这里要注意的是,如果是web登录,理论上前端是无法安全的存储密钥的,所以要使用非对称加密,不能使用对称加密)

问题2
  • 用户的密码要怎么安全的存储在系统里面?推而广之,要如何安全存储敏感数据?

用户的密码在后端存储时,是可以采用加密存储的。直接存储用户的明文密码肯定是不行,否则一旦黑客攻击就会不费吹灰之力拿到用户的密码!敏感数据比如手机号、身份证号、家庭住址等都可以采用此方案统一处理

防君子不防小人

不过密码是一种非常特殊的存在,安全级别应该相当高,值得特别谨慎对待。因为用户密码除了用户知道外,还在系统的某个地方存储的,假设在数据库里面,那DBA理论上可以直接获取用户加密的密码。所以理论上应该除了用户之外,任何人都不应该能获取到用户密码,包括DBA和各种系统"后门"

由于加密技术的特性:数据能被加密,就一定能被解密,是一个"可逆"的过程,所以一般的设计账户体系的时候,密码一般不会选择加密存储,而是采用单向散列函数取"摘要"存储,这样就避免了"任何人"都无法知道用户的密码,从根本上杜绝了密码泄露:

对于用户密码管理,除了防止被黑客获取,直接拖库获得明文;也要防止管理员直接获取,所谓的监守自盗。所以一般密码存储都是散列函数加密存储,这样即使泄露,也不能直接获得明文导致泄露,因为即使得到了密文,基于单向的特性,要反向推算出明文非常困难,所以理论上这个难度系数足够大,甚至可以认为密文就是不可逆的,也就是安全的

在此基础之上,还有各种各样的加强方案,比如密码+盐等,后面会单开详细讨论!除此之外,单向散列函数还有一个应用就是解决完整性问题,可以参见:数据安全系列2:单向散列函数概念

 消息认证码

在前面一节,挖了一个坑:

  • 在下一节单独介绍一下,一般API调用的加验签做方法

虽然这里也不打算填上(会涉及到具体的代码设计实现),不过会探讨一下,什么是消息认证码及应用。消息认证码也是基于单向散列函数的特性来实现的,不过跟单纯的使用单向散列函数不同,这在消息认证码中还会利用对称密码技术:即消息发送者-接收者"共享密钥",在计算散列值时,通过"共享密钥"的参与,得到消息认证码(Message Authentiaction Code),简称MAC值来达到同时满足"完整性"与"认证"的目的!比如在一个接口调用的场景中:

  • 在这样的交互过程中,交互的双方需要共享密钥,也即是前面的对称密钥
  • 要计算MAC值,必须持有共享密钥,没有就无法计算MAC值,消息认证码正是利用此特性来完成所谓的认证的。

就是说,接收方如果判断MAC值不相同,则可以认为请求非法而拒绝服务,而这种方式广泛应用于系统间接口调用身份识别,这样就可以防止"身份伪装"

数字签名

说到"数字签名",一开始也是比较陌生,而且实际开发中用的也不是很多。它看起来有点像是非对称加密的逆过程:

  • 用公钥加密,私钥解密,这称为加密
  • 用私钥加密,公钥解密,这称为签名

关于非对称加密,在对密钥对的规范使用时要求:一般是公钥可以公开的,私钥是保密的。所有人理论上都可以获取公钥,但是私钥只有指定对象才能持有,且不能被泄露(关于密钥的管理,是另外一个比较大的话题,比如KMS系统,这里不展开讨论)。

这里可能有一个直接的问题就是,又是谁来保证公钥又是对的呢?这里标准的做法是CA,用权威机构来背书,颁发证书来完成,也不展开(也即解决"密钥套娃"的问题,这在计算机中有很多案例)。回到数字签名上来,它要解决的一个核心问题就是防抵赖!或者叫"不可否认"

这里说的"不可否认",跟消息认证码的"认证"的区别在于:

  • 采用消息认证码,接收方能唯一确认发送方,防止被"第三方"冒充
  • 采用数据签名,接收方不仅能唯一确认发送方,还能防止发送方事后抵赖说,自己没有发送过请求

其中的关键就在于消息认证码的"共享密钥",因为除了发送方之外,接收方也知道这个密钥,最坏的情况就是:比如转账的情况,明明是发送方(客户)发起了一笔转账,接收方(银行)执行了资金划扣,事后说发送方(客户)不承认,说是你们银行的员工监守自盗,要求赔钱。这样银行也有理说不清了,因为它的确知道发送方(客户)的密钥(如果内部人泄露),理论上是有可能伪造转账请求的,程序也是正常检验通过的。

但是在非对称的情况下,发送方(客户)私钥只有它自己知道,外人无法得知,如果发起了一笔转账,理论上只有是它自己而不可能是别人,就从根本上杜绝了伪造的可能,所以达到"不可否认"的目的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值