永强持续教你加解密对称篇二

永强被吓坏了!因为永强看到了某个微信群有人指出公众号里上篇打酱油附送的那篇文章《震惊!北京一男子竟然用swoole做了这种事!》的内容实在是太low了,这种low文章就不要拿出来发了。 但是给永强留下了面积巨大的心理阴影。他尚未见识过社交网络的恶毒嘴脸。 所以永强本来昨天要发的文章拖到了今天,但是永强实在是怕了,他怕被人喷了被人骂了。虽然我百般鼓励,但他还是心有余悸。尽管我都已经直接告诉他“你那玩意根本就没人看”了,他还是依然不敢发了。然后我不得不摆出PS大法给他做了一张图,他看了看那张图后又收了我6.66元的微信红包,决定继续鼓起勇气发了。 是时候表现一下我的PS精湛技术了! “我们历经千辛万苦,摸打滚爬过数不清的错误,发射了不知道多少枚长征系列,耗费了一代航天人的心血,终于看到了地球与月亮通信的曙光,然后就在五分钟,我们惊讶地发现,原来老王的smartmesh技术早就实现了,甚至连地球文明与外形文明的通信都给出了完美的解决方案…” ——— 尼古拉斯 * 赵永强 众所周知,作为精通各种技术表演的我早就已经不屑于采用ppt的方式吹牛了,一般我都是直接上机操作表演,当然了,程序都是提前写好了的,全是mock的假数据,脚本实现自动化,无论谁来操作都是流畅的,一切都是完美的! 作为一个追求完美的人,我还得继续接着吹上次聊到结尾,好像是遗留了两个问题: ecb、cfb、cbc等这些后缀是什么意思iv向量又是什么意思鉴于DES和3DES已经属于不建议使用的方法了,所以这次我们直接用AES加密进行装逼表演,比如下面这坨代码,你们复制粘贴走运行一下: <?php$ava_methods = openssl_get_cipher_methods();// 选用aes-128-ecb$my_method = 'aes-128-ecb';if ( !in_array( $my_method, $ava_methods ) ) { exit( '错误的加密方法'.PHP_EOL );}// 加密用的密码$key = "1234567812345678";// 加密的内容$data = "12345678abcdxxoo12345678abcdxxoo";$enc_data = openssl_encrypt( $data, $my_method, $key, OPENSSL_RAW_DATA );$hex = bin2hex( $enc_data );echo $hex.' : '.strlen( $hex ).PHP_EOL;我这里运行结果是: c1391e34caf38f8c2a477cbda3772533c1391e34caf38f8c2a477cbda3772533d96aa42b59151a9e9b5925fc9d95adaf : 96分析一下上面代码:这次我们选用的加密方法是AES-128-ECB,这个128是什么意思?128就是密钥长度的意思:128bit;如果你留心的话,还会注意到有aes-192-ecb和aes-256-ecb,其实就是指加密密钥长度为192bit、256bit,然后是值得注意的一个地方是: $enc_data = openssl_encrypt( $data, $my_method, $key, OPENSSL_RAW_DATA );最后一个参数是OPENSSL_RAW_DATA,如果选用这个option的话,经过加密后的数据会是奇怪的二进制数据,无法直接通过文本方式查看,所以要看的话必须先使用bin2hex函数处理一下。 注意了哈,我选的这个密钥1234567812345678是有特殊用意的,这个密钥的长度是16字节也就是128bit,而我们选用的aes加密方法中要求的密钥长度就是128bit,那么我们尝试将密钥增加几位变成:1234567812345678abc,然后其他代码不做任何改动,再次执行加密,结果如下: c1391e34caf38f8c2a477cbda3772533c1391e34caf38f8c2a477cbda3772533d96aa42b59151a9e9b5925fc9d95adaf : 96就是说用“1234567812345678”和“1234567812345678abc”加密后的数据都是一样的。看起来如果我们选用128bit密钥长度的话,一旦密钥长度超过128bit后面多余的部分会被直接无视掉~~~ ...

June 18, 2019 · 1 min · jiezi

angular使用md5CryptoJS-des加密

在业务系统中,通常需要对用户的密码进行加密,再时行http的请求。加强系统登录的安全验证。 常用的加密方式有MD5, Base64, CryptoJS的 AES DES等。下面介绍我常用的几种加密方法的使用: MD5加密1. 安装模块 ts-md5$ npm install ts-md5 --save2. 使用md5进行加密import { Md5 } from 'ts-md5';// ...// 密码password: string = "12345";// 加密方法 - md5加密decode() { const passwordMd5 = Md5.hashStr(this.password).toString(); // 结果:827ccb0eea8a706c4c34a16891f84e7b}Base64加密1.安装模块 js-base64$ npm install js-base64 --save2.使用md5进行加密import { Base64 } from 'js-base64';// ...// 密码password: string = "12345";// 加密方法 - Base64加密decode() { const passwordBase64 = Base64.encode(password); // 结果:MTIzNDU=}DES加密DES对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥key,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种对称加密算法。crypto-js Github: https://github.com/brix/crypt... 1.安装模块 crypto-js$ npm install crypto-js --save2.使用DES进行加密import CryptoJS from 'crypto-js';// ...// 密钥key: string = "abcdefg";// 密码password: string = "12345";// 加密方法 - des加密decode() { // key编码 const keyHex = CryptoJS.enc.Utf8.parse(this.key); console.log(keyHex.toString()); // 结果:61626364656667 // 加密 const passwordDES = CryptoJS.DES.encrypt(this.password, keyHex, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).toString(); console.log(passwordDES); // 结果:zYGeIdaZpEM=}3. 使用AES进行加密加密用法基本与des一致。 ...

June 3, 2019 · 1 min · jiezi

【融云分析】当我们在谈通讯安全时,我们在谈些什么

当谈论通讯安全的时候,通常我们关心的是下面四个问题:1)防止消息窃听当传送的消息是机密内容的时,人们希望给消息加密。这样即使消息在传送过程中被截获,窃听者也无法确切的知道消息内容,从而达到保密的效果。2)防止消息篡改消息在传送过程中,有可能被攻击者篡改内容,这样接收者接到的就是错误的信息,通讯过程中应该提供某种方案防止篡改。3)防止消息伪造攻击者假冒发送者的名义,给接收者发送消息,这种行为称为消息伪造。4)防止否认发送者事后否认自己发送过消息,需要有一种机制来防止这种情况发生。下面,我们将详细分析下这四个问题。防窃听提到加密,很多人的第一反应是下面这样:“自己实现一个加密算法,然后将算法保密,这样就能保证安全。“在密码学的领域,这是个典型的误区。首先,开发高强度的加密算法是非常困难的。普通的算法在外行看起来牢不可破,但是专业破译者却有非常多的工具和攻击方式,使其破绽百出。其次,加密算法的秘密总有一天会公诸于世。到那时,所有基于这个算法的秘密都将被泄露。实践中使用的加密算法都是公开的,消息传递依靠保密的密钥来确保消息不被破解。正因此,它们经过攻击者长期尝试仍未被破解,所以保密强度较高。常用的加密体系分为三类,对称加密、非对称加密和混合加密。1.1 对称加密对称加密是指加密和解密用的是同一个密钥。这个密钥只有发送者和接收者知晓,其他没有密钥的人无法解密消息。常见的对称加密算法有 DES 、 3DES 和 AES 等。随着计算机硬件的进步,使用暴力破解法已经能在现实时间中完成对 DES 的破解; 3DES 处理速度不高,此外在安全性方面也逐渐显现出了些问题;目前应该选用的算法是 AES 。1.2 非对称加密与对称加密不同,非对称加密算法需要两个密钥——公钥和私钥。公钥和私钥是一对。公钥加密,对应的私钥才能解密,反之亦然。前面的场景适用于防窃听,后面的场景适用于数字签名,也就是防止否认。实现机密消息交换的基本过程是:甲方生成一对密钥并将其中一个作为公钥向其它方公开,得到该公钥的乙方使用该公钥对消息进行加密再发送给甲方,甲方再使用自己的私钥对消息进行解密。网络中的其他窃听者虽然也能拿到甲方的公钥,但是加密后的消息只有私钥才能解开,所以他们无法破译消息。最常使用的非对称加密算法是 RSA 。1.3 混合加密比较一下对称加密和非对称加密各自的特点:对称加密处理速度快,但是由于通讯双方使用的是同一个密钥,存在密钥配送困难的问题。要求通讯双方线下交换密钥是不现实的,而线上配送又存在被窃听的风险。非对称加密的公钥本身就是可以对外公开的,天然避免了密钥配送的问题;但是非对称加密的处理速度远远低于对称加密。混合加密体系是将上述两种优势相结合的办法。先看一下加密过程。通讯过程中传送了两部分内容:一部分是使用对称加密算法加密的消息,另一部分是对称加密的密钥。其中对称加密的密钥是由接收方的公钥加密过的,这样除了接收方之外,任何其他人都不能解开对称加密的密钥,从而也无法解开加密的消息。加密过程相比于要传送的消息本身,对称密钥的长度要短得多。非对称加密的处理速度慢,所以只用来加密对称密钥,而很长的消息则用处理速度快的对称算法来加密。下面是解密过程。先把对称加密的密钥和加密后消息这两部分分离开。对称密钥之前是用接收者的公钥加密的,所以只能使用接收者的私钥进行解密。对称密钥解出来之后,就可以对消息密文进行解密了,从而得到消息明文。防篡改通讯过程中,接收方有时候会有这样的疑问:“我接收到的消息确实就是发送者发过来的那条吗?在传输的过程中会不会已经被攻击者给改写了?“这是对消息完整性的挑战。实践中一般使用摘要算法来应对这种挑战。摘要算法有如下重要特性。第一,输入任意长度的字符串,输出固定长度的字符串。比起要传输的消息长度来说,输出的固定长度通常很短,因此很容易进行处理。第二,相同的输入总是对应相同的输出。发送方对消息进行摘要处理,同时把摘要附在消息里发送出来。接收方收到之后用同样的摘要算法对消息进行处理,再把计算出来的摘要和收到的摘要进行对比,如果不一致,就能知道消息已被篡改。第三,给定一个字符串 A ,经过摘要算法处理后的串 B ,很难找到一个字符串 C ,使其摘要后的串和串 B 相同。这个重要的特性称为抗碰撞性(弱抗碰撞性)。这条特性使得攻击者在篡改消息后,很难再计算出同样的摘要,从而规避摘要算法的检查。第四,这种转换具有单向性,即不能通过输出串倒推出输入串。常用的摘要算法包含 MD4 、 MD5 、 SHA-1 和 SHA-2 (包含 SHA-256 、SHA-384 和 SHA-512 )。上述算法中目前唯有 SHA-2 算法的强抗碰撞性尚未被攻破。防伪造防伪造指的是"消息来自正确的发送者”。防篡改关注的是消息内容,防伪造关注的是消息发送者本身。防篡改关注的是消息的完整性( integrity ),防伪造关注的是消息的认证( authentication )。消息认证码( Message Authentication Code )是一种既能检查消息完整性,又能做身份验证的技术,取三个单词的首字母,简称为 MAC 。实践中经常使用与密钥相关的摘要算法来实现消息认证码。消息认证码的使用步骤如下:发送者和接收者事先共享密钥;发送者使用共享密钥对消息计算 MAC 值;发送者将消息和 MAC 一起发给接收者;接收者使用共享密钥对接收到的消息计算 MAC 值;接收者将计算的 MAC 值跟接收到的 MAC 值做比较;由于攻击者没有共享密钥,所以无法跟接收者算出一样的 MAC 值。跟对称密钥一样,这里同样面临密钥配送的问题,我们仍然可以采用非对称加密的方式进行密钥配送。除此之外, Diffie-Hellman 算法也是常用的密钥交换方式。防否认想象一下这个场景, Bob 收到了一张 Alice 发来的五百万元的借条。使用事先约定好的共享密钥, Bob 计算出的 MAC 值跟借条里收到的 MAC 值一致,这表明消息没有被篡改,同时消息也不会是第三方伪造的,那么就没有任何后顾之忧了吗?并不是这样。问题在于共享密钥是两个人持有的,因此能算出正确 MAC 值的并不只是 Alice , Bob 也能。如果 Alice 声称自己没有发过这样的借条,那作为第三方仲裁者来说,无法证明借条是 Alice 生成的还是 Bob 生成的。我们需要寻求一种解决方案, Alice 使用的签名是由只有她自己才知道的密钥生成,同时别人还能顺利解开。这样别人无法伪造 Alice 的签名,同时还能验证这个签名。看上去是不是有点熟悉?没错,就是之前介绍过的非对称加密。Alice 使用自己的私钥对消息进行签名(加密),同时对外发布对应的公钥。无论是 Bob 还是第三方仲裁者,都可以使用公钥对签名进行验证(解密)。这种方案称为数字签名。后话到目前为止,看上去我们解决了之前提出的四个问题,但是通讯安全领域的问题还远不止这些。比如怎么验证公钥的可靠性?比如怎么才能生成一个可靠的随机数?再延伸下去我们会涉及到证书,认证机构和随机数的分级等领域,这里就不再一一展开了。最后,请大家记住一句话:只有完美的密码,没有完美的人。不管多精密的系统,在确保整体安全方面,人是一个特别巨大的弱点。很多时候,最脆弱的环节并不是各种算法,而是人类自己。 ...

April 10, 2019 · 1 min · jiezi