最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

关于PHP加解密之终扯到ECDH了

XAMPP教程 中文小张 647浏览 0评论
  • 对称加解密,典型算法有AES、DES、3DES等等
  • 非对称加解密,典型的算法有RSA、DSA、ECDH等等

但是,我知道大家最讨厌在看这种文章的时候冒出来的一坨“椭圆曲线”、“素数”、“质数”等等这样的玩意,反正看也看不懂,理解也理解不了,背也背不过,所以我索性就不写这些玩意,一点儿都不写,不装任何逼(然而实际上我背过了,我最近一直在搞线性代数,所以对数学比原来稍微敏感了一些)。

写到这里后,就有刁民、php泥腿子自以为已经掌握了高科技,随便从github上扒两个库下来跑了跑test就开始四处装逼,声称自己精通对称加密算法和非对称加密算法,尤其是在面试的时候,上去就是跟面试官一顿糊弄,糊弄住了就要5万,糊弄不了要5千。然而我要告诉你的是,你应该接继续往下看,这样的话你在面试的时候,糊弄住了就可以张口要8万,糊弄不了也能最低要8千!比原来要5000整整多了3000!而且我提供的这份装逼指南还是免费的!

 

今天我们从一个实际需求作为出发点,比如你是API开发人员(当然了,作为只有十来个人的小公司,你还得兼职运维,不过工资只按开发算,运维的活儿算是你友情赞助给老板的),然后老板兼PM向你提出了一个比较严峻的问题,大概意思就是“公司的项目是个非常牛逼的项目,一年后公司是要上市的,你必须要加密了数据,让BAT和TMD都无法抄袭我们!然后你就能买车买房!”,你表示十分认可。由于你已经看过了我前面两篇文章,再加上老板一再强调“我们这个是牛逼的项目,迟早要上市”,所以你就准备用高安全性的非对称加密来解决这个问题。

具体做法就是服务器生成一对公私钥,然后再生成一对公私钥给所有客户端公用。比如用户登陆API,接口文档大概如下:

API : https:METHOD : POSTPROTOCOL : 将数据以JSON形式,全部放入到http body体中,key叫做mzipDATA : {  'username' => 'xitele',  'password' => 'qiangdadaoniyongyuancaibuchulaishiduoshao'}

然后客户端执行登陆的伪代码如下:

var username string = 'xitele'var password string = md5('123456')var data = jsonize( hashMap(  'username' : username,  'password' : password) )var encryptData = RSA.encrypt( '服务端的公钥', data )var lastJson = jsonize( hashMap(  'mzip' => encryptData) )http.post( 'https://www.so.com/api/user/login', lastJson, function() {  } )

服务器端使用世界上最好的语言来实现的,所以代码你会觉得十分眼熟:

<?php$jRawData = file_get_contents( 'php://input' );$aRawData = json_decode( $jRawData, true );$jDecryptData = RSA::decrypt( '服务器的私钥', $aRawData['mzip'] );$aDecryptData = json_decode( $jDecryptData, true );$pdo = new PDO();$sth = $pdo->prepare( "select * from user where username=:username" );$sth->bindParam( ':username', $aDecryptData['username'], PARAM_STR );$pdo->execute();$aUser = $pdo->fetch();if ( $aUser['password'] != $aDecryptData['password'] ) {  echo json_encode( array(    'code' => 0,    'msg' => '登陆成功'  ) );}else {  echo json_encode( array(    'code' => 10002,    'msg' => '登陆失败'  ) );}

上线后,发现倒也没啥大问题了,就是明显服务器CPU负载特别高,客户端也感觉有点儿卡。很明显,非对称加密的CPU极大的消耗成了一种瓶颈。于是你找老板申请服务区费用,老板当场表示非常理解,大手一挥就给你批了300块钱并表示随意挥霍,把服务器升级成最牛逼的服务器。

当然了,都跟我学习了这么久了你应该马上就意味到300块代表着什么,300块顶多代表能组两个局儿… …

当然了,API那里也好交代,全线降级为AES对称,CPU瞬间就下来了,又不是不能用.. …

当然了,300块组个五人局儿应该还是可以的,除了你和我,再拉上柱子跟老赵,最后再带上陈旭,局儿上除了吃饭,就额外讨论一下关于这个问题的解决方案。

局儿后,我神神秘秘地告诉你说“这特么简单,我给你讲,你服务器先随机生成一个AES对称加密用的密钥,然后利用客户端的RSA公钥加密后传给客户端,客户端再通过自己的RSA私钥解密得到这个AES对称密钥,然后再用这个AES对称密钥进行后续的加解密即可,然后你可以给这个AES密钥设定一个有效期,比如五分钟,当过期后,就再次利用上面的流程申请新的AES密钥即可!这样,不仅保证了AES密钥的安全,还能解决了性能问题!”

铺垫这么长,终于能扯出来今天的讨论关键点了:密钥协商/交换!这就是我们今天的核心话题了。

先说下为什么会出现密钥协商和交换这种玩意,其实就是为了避免密钥在网络上的传输被劫持导致的安全问题,前两句话的潜台词就是“这个世界上存在着一种即便我不告诉你,你也能知道我想告诉你什么的心有灵犀解决方案”。

密钥协商交换一般常用的有如下几种方案:

  • 利用RSA等非对称加密技术进行交换,也就是300块的局儿上那个方案
  • 利用专门伺候密钥交换需求的交换算法,比如DH算法,全称叫做Diffie-Hellman密钥交换。Diffie和Hellman分别是两个大叔的名字(注意,此二位是数学家),是他们合伙搞出来的这个算法,DH算法先于RSA出现。

转载请注明:XAMPP中文组官网 » 关于PHP加解密之终扯到ECDH了

您必须 登录 才能发表评论!