larave的aes加密模式

我不断奔跑,就是为了追上那个曾被给予厚望的自己

关于加密

加密算法分为单向加密和双向加密。
单向加密包括MD5,SHA加密算法等等。单向加密算法是不可逆的,也就是无法将加密后的数据恢复成原始数据,除非采取碰撞攻击和穷举的方式。像是银行账户密码的存储,一般采用的就是单向加密的方式。
双向加密是可逆的,存在密文的密钥,持有密文的一方可以根据密钥解密得到原始明文,一般用于发送方和接收方都能通过密钥获取明文的情况。
双向加密包括对称加密和非对称加密。
对称加密包括DES加密,AES加密等等,本文档介绍的主要是AES加密。而非对称加密包括RSA加密,ECC加密。

AES加密

AES加密时需要统一四个参数:

  • 密钥长度 (Key Size)
  • 加密模式 (Cipher Mode)
  • 填充方式 (Padding)
  • 初始向量 (Initialization Vector)

由于前后端开发所使用的语言不统一,导致经常出现前后端之间互相不能解密的情况出现,其实,无论什么语言系统,AES的算法总是相同的,导致结果不一致的原因在于上述的四个参数不一致,下面就来了解一下这四个参数的含义
密钥长度
AES算法下,key的长度有三种:128、192、256 bits,三种不同密钥长度就需要我们传入的key传入不同长度的字符串,例如我们选择AES-128,那我们定的key需要是长度为16的字符串
加密模式
AES属于块加密,块加密中有CBC、ECB、CTR、OFB、CFB等几种工作模式,为了保持前后端统一,我们选择ECB模式
填充方式
由于块加密只能对特定长度的数据块进行加密,因此CBC、ECB模式需要在最后一数据块加密前进行数据填充
初始向量
使用除ECB以外的其他加密模式均需要传入一个初始向量,其大小与Block Size相等

laravel的加密

laravel中自带的加密算法采用AES-256-CBC的这种加密算法,源码位置Illuminate\Encryption\Encrypter, 准确的说AES才是一种加密算法,256则指密钥长度为256bit,密钥长度越长当然是越安全相应的消耗的时间也越多,但对现在的计算机而言差距并不明显,CBC则指的是AES加密工作体制中的一种

在使用 Laravel 的加密程序之前, 你必须先设置 config/app.php 配置文件中的 key 选项。运行 Artisan命令 php artisan key:generate,它会使用 PHP 的安全随机字节生成器来构建密钥。如果这个 key 值没有被正确设置,则所有由 Laravel 加密的值都将是不安全的。

1
2
3
4
5
6
7
8
9
10
// 加密
$name = 'yangguoqi';
$secret = encrypt($name);

$a = 'eyJpdiI6Im42Z3IzeVNmTDNtXC9nT0NvaGV0NjNRPT0iLCJ2YWx1ZSI6IjhlTGRGYyt6aWhubjREM1BTM0EybExpdlhuMU1FTFwvSUhzUTVnNHRwekJNPSIsIm1hYyI6IjlmZTY3MDczMDg0NzJiMDUwNTRiMGNiYWM3YTAzYzQ4Y2EwOTA4MjJkMDM2OWEyZmVhODcwODUxZWNjMDRkYWEifQ==';
$b = 'eyJpdiI6InJcL1IwcklzbFcyTUZsSVhNS1k3RXFBPT0iLCJ2YWx1ZSI6IlwvV1dCcWdXS21hbERmWnFPWDVYa1hlN0RadkJlQUt4Nkh4bzczS2JuOEFRPSIsIm1hYyI6IjhhN2E0OWE2ZTc3ZTU4YzQzOGYzYmUzZDA3NWYwNTVlOTllNzQ1ZWY5YTE0NzE4NTUzM2E2MDY4ZDVkMzNhOTYifQ==';

// 解密
dump(decrypt($a));
dump(decrypt($b));

说明

注意: 虽然每次加密的是同一个字符串, 但是每次的结果都是不一样的, 用不一样的结果通过解密是可以拿到相同的值的
因为加密后的字符串可能在网络传输中被篡改,为了保证数据的安全性,laravel通过hmac_sha256算法使用base64编码后的iv,value计算出了MAC值,这个mac值是对于这次加密是独一无二的