前言

对laravel加密机制使用OpenSSL提供AES-256和AES-128加密。本文将介绍加密和解密的实现在Laravel,分享出来供大家参考。让我们详细介绍一下。



1。使用方法

第一个是生成一个密钥,您需要在提供app_key Restore.env目录,如果没有的话,可以通过命令工匠密钥生成:生成PHP,你可以设置它自己产生的例子应该是这样的




app_key base64:5bm1bxbrgeeqjmawjzszyzh5ypcccogptuij65g = =


配置加密密钥和加密算法的文件,并将其配置在配置/ app.php目录




为关键= env('app_key),

密码= > 'aes-256-cbc,


利用该方法,已经有办法用在laravel,和不太说这里的两个主要方法是加密和解密的解密。



2。搜索加密和解密文件

的实施方法的定位是找到两个文件供应商/下照亮/加密/目录,一个是encryptionserviceprovider和Encrypter

三.EncryptionServiceProvider文件分析


公共函数寄存器()
{
美元->程序-> Singleton('encrypter功能($ APP){
配置应用程序->美元= $(使'config)->得到('app '); / / / app.php配置获取配置文件

如果(STR::从($key = $配置{关键},'base64:')){配置文件 / /分析主要有no'base64
美元关键= base64_decode(substr($,7); / /)是否对关键Base64前:取消,并解析出原始字符串。
}

返回新的加密($关键配置{ 'cipher美元'}); / /加密类实例化为框架。
});
}


本文档没有很多东西,但是我们可以看到这个,事实上,在配置文件中,我们可以直接写关键字,也可以解析无功能。它相当于省几步



此外,当实例化的类,你需要在密钥和加密方法通过

4。对加密文件的分析

1。分析__construct,执行之前实例化


公共功能__construct($键,密码= 'aes-128-cbc美元)
{
$键(字符串);将键转换为字符串

如果(静态::支持:($,密钥,$)){调用一个自定义方法来确定密钥长度的加密方法和要求是相同的
$此键= $键;
这个密码= $密码;
{人}
抛出RuntimeException(仅支持密码AES-128-CBC和aes-256-cbc用);
}
}


上述方法主要用于确定加密长度和密钥长度是否相同,因为不同加密方法所需的相应密钥的长度也是必需的。每个特定的加密模式都需要键的长度来查找相应的文档。


支持公共静态函数($密钥,$密码)
{
长度= mb_strlen美元(美元关键,'8bit ');在密钥长度的字符 / /判断,根据8bit位模式字符长度的计算

返回(cipher'aes-128-cbc美元美元= = = = = =长度16)| |
(cipher'aes-256-cbc美元美元= = = = = =长度32); / /编码AES128要求格式是16个字符长度。所需的字符代码长度为32位的格式进行AES256
}


上述方法具有精确的地方,使用mb_strlen方法需要计算长度按8bit位计算的优点是无论哪个操作系统,其计算长度是相同的。



考虑到不同的操作系统,就不会有加密问题。

2。加密方法分析


公共加密函数(美元价值,美元将= true)
{
四美元= random_bytes(16); / /创建一个16位的随机字符串


/ /使用openssl_encrypt数据来生成一个加密的数据
1,确定是否需要生成存储值的表示,这是对您的数据是一个数组或字符串是否可以使您变成一个字符串,而不是判断您是否通过数据数组或字符串进行的。
2、对openssl_encrypt / /使用。第一个参数传入的数据,第二参数传递到aes-256-cbc加密,目前使用的加密方法,第三个参数是原始的,返回的数据进行加密,加密的数据一个base64编码后,Base64编码的0位数据字。第四参数是项目的数量,这是通过随机数,以加密数据每次加密的数据是不同的。
价值= openssl_encrypt(
序列化序列化美元(价值):美元的价值,
这个密码,这个键,0,四美元。
); / /使用AES256加密内容

如果($ = false){
把新的encryptexception(不加密数据。);
}

$ MAC =美元->哈希(四= base64_encode美元($ IV),美元的价值); / /创建一个签名,以确保内容的参数没有改变

JSON = json_encode美元(紧凑型('iv '价值','陆委会')); / /随机码,加密的内容有签名,形成一个阵列,并转化为JSON格式

如果(!is_string($ JSON)){
把新的encryptexception(不加密数据。);
}

返回base64_encode($ JSON); / / JSON格式是Base64,传输
}


上面使用了一种定制方法哈希(),我们可以看到该方法的实现。


受保护函数散列($ IV,$)
{
/ /签名
1、 / /随机值进行
2 /,hash_hmac生成使用SHA256加密,验证参数的变化。第一个参数是SHA256加密方法,使用目前,二是与一个随机值加密的内容,第三个参数是对密钥的使用产生一个签名。
返回hash_hmac('sha256,四美元美元价值,美元->键); /生成一个基于随机值和内容实现签名
}


上述加密分为三个主要步骤

1。生成随机密码



2。产生加密内容



三.生成的签名

该框架使用一种优雅的方式使用序列化产生价值。这种方法是优雅的,那就是,无论你的内容是一个数组或字符串,它可以转换成一个字符串,使用序列化和json_encode之间的差异是最大的优势。序列化是更快,当你想加密内容。



另一个地方是框架在加密时使用一个随机字符串。为什么要使用随机字符串,因为使用了一个随机字符串,所以每个加密的内容是不同的,以防止其他人猜测。

三.解密方法分析

解密数据可以说是最复杂的一段数据,不仅对数据进行解密,而且保证数据的完整性,防止数据篡改。


公共函数解密(美元的有效载荷,序列化美元= true)
{
有效载荷=美元美元-> getjsonpayload($有效载荷); / /字符串加密转换为数组后。

四美元= base64_decode($载荷{ 'iv}); / /随机字符串Base64发布

为解密= openssl_decrypt( / /解密数据
美元币值的有效载荷{ },美元->美元->密码,钥匙,0、四美元
);

如果($解密=假){
把新的decryptexception(不解密数据。);
}

返回序列化序列化(解密:解密美元)美元; / /转换数据的原始数据
}


getjsonpayload方法


保护功能getjsonpayload($载荷)
{
$payload = json_decode (base64_decode ($payload), true); / / put the data into the original array form

如果(!美元-> validpayload($有效载荷)){ / /验证不是数组和数组的随机字符串,加密内容,签名
把新的decryptexception(有效载荷是无效的。);
}

如果(!美元-> validmac($有效载荷)){ / /验证数据被篡改
把新的decryptexception(MAC无效。);
}

返回有效载荷;
}


validpayload方法不说,简单和基本的,强调的是谈论这个validmac验证,以确保数据没有被篡改,这是最重要的。


保护功能validmac(数组的有效载荷)
{
元计算=美元-> calculatemac(有效载荷字节= random_bytes美元,$(16)); / /获取数据并生成一个签名的随机值

返回(hash_equals /比下面的签名和散列签名上一步生成的是一样的。
hash_hmac('sha256 ','陆委会' } { $有效载荷,$字节,如此,美元计算) / /根据签名的新一代的原始数据的签名
);
}


的calculatemac方法是生成一个签名基于原始数据的随机值,然后用这个签名来重新创建一个签名。


保护功能calculatemac(美元的有效载荷,为字节)
{
返回hash_hmac(
实现,美元->哈希($载荷{ 'iv},{ }美元币值的有效载荷字节),美元,真的
);
}


上面的解密分为三个主要步骤

1。判断数据的完整性



2。判断数据的一致性



3,解密数据内容。

这个验证签名有一个奇怪的地方,他不像我们通常对签名的验证。我们通常验证签名,用原始数据和随机值生成签名,然后比较产生的签名和原始数据来确定它是否被篡改。



但是有很多框架。他使用原始数据和随机值生成签名,然后用这个签名生成签名。比较是在原始数据中生成一个带有签名的签名,然后比较它。我现在想不起来,你为什么要这么做呢。



在加密的时候,我们把原始数据序列,所以我们还需要将数据序列化。

小心

用于加密openssl_encrypt随机项的值是原始数据的原始值。使用后openssl_decrypt解密值经过base64位随机字符串。
当时间签名比较解密的一代,而不是原来的签名,然后根据原始数据,生成一个签名的比较,而是使用原始签名人生成一个基于签名的签名,然后生成的原始数据,在新一代签名生成签名。然后比较的。
AES256是加密的数据,及后是可以逆转的对数据进行加密。加密的签名的生成,是不可逆的过程,验证数据的完整性。


总结

以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一定的帮助。如果有任何疑问,您可以留言交流,谢谢您的支持。