php数据加密解密 php密码加密技术phpass

PHP对称加密-AES 对称加解密算法中,当前最为安全的是 AES 加密算法(以前应该是是 DES 加密算法),PHP 提供了两个可以用于 AES 加密算法的函数簇: Mcrypt和OpenSSL。
其中 Mcrypt 在 PHP 7.1.0 中被弃用(The Function Mycryptis Deprecated),在 PHP 7.2.0 中被移除,所以即可起你应该使用 OpenSSL 来实现 AES 的数据加解密 。
在一些场景下,我们不能保证两套通信系统都使用了相函数簇去实现加密算法,可能 siteA 使用了最新的 OpenSSL 来实现了 AES 加密 , 但作为第三方服务的 siteB 可能仍在使用 Mcrypt 算法,这就要求我们必须清楚 Mcrypt 同 OpenSSL 之间的差异,以便保证数据加解密的一致性 。
下文中我们将分别使用 Mcrypt 和 OpenSSL 来实现 AES-128/192/256-CBC加解密,二者同步加解密的要点为:
协同好以上两点,就可以让 Mcrypt 和 OpenSSL 之间一致性的对数据进行加解密 。
AES 是当前最为常用的安全对称加密算法 , 关于对称加密这里就不在阐述了 。
AES 有三种算法,主要是对数据块的大小存在区别:
AES-128:需要提供 16 位的密钥 key
AES-192:需要提供 24 位的密钥 key
AES-256:需要提供 32 位的密钥 key
AES 是按数据块大?。?28/192/256)对待加密内容进行分块处理的,会经常出现最后一段数据长度不足的场景 , 这时就需要填充数据长度到加密算法对应的数据块大小 。
主要的填充算法有填充 NUL("0") 和 PKCS7,Mcrypt 默认使用的 NUL("0") 填充算法,当前已不被推荐,OpenSSL 则默认模式使用 PKCS7 对数据进行填充并对加密后的数据进行了 base64encode 编码,所以建议开发中使用 PKCS7 对待加密数据进行填充,已保证通用性(alipay sdk 中虽然使用了 Mcrypt 加密簇 , 但使用 PKCS7 算法对数据进行了填充 , 这样在一定程度上亲和了 OpenSSL 加密算法) 。
Mcrypt 的默认填充算法 。NUL 即为 Ascii 表的编号为 0 的元素,即空元素,转移字符是 "\0",PHP 的 pack 打包函数在 'a' 模式下就是以 NUL 字符对内容进行填充的,当然,使用 "\0" 手动拼接也是可以的 。
OpenSSL的默认填充算法 。下面我们给出 PKCS7 填充算法 PHP 的实现:
默认使用 NUL("\0") 自动对待加密数据进行填充以对齐加密算法数据块长度 。
获取 mcrypt 支持的算法 , 这里我们只关注 AES 算法 。
注意:mcrypt 虽然支持 AES 三种算法,但除MCRYPT_RIJNDAEL_128外 , MCRYPT_RIJNDAEL_192/256并未遵循AES-192/256标准进行加解密的算法,即如果你同其他系统通信(java/.net),使用MCRYPT_RIJNDAEL_192/256可能无法被其他严格按照AES-192/256标准的系统正确的数据解密 。官方文档页面中也有人在 User Contributed Notes 中提及 。这里给出如何使用 mcrpyt 做标注的AES-128/192/256加解密
即算法统一使用MCRYPT_RIJNDAEL_128 , 并通过 key 的位数 来选定是以何种 AES 标准做的加密,iv 是建议添加且建议固定为16位(OpenSSL的 AES加密 iv 始终为 16 位,便于统一对齐),mode 选用的 CBC 模式 。
mcrypt 在对数据进行加密处理时 , 如果发现数据长度与使用的加密算法的数据块长度未对齐 , 则会自动使用 "\0" 对待加密数据进行填充 , 但 "\0" 填充模式已不再被推荐 , 为了与其他系统有更好的兼容性 , 建议大家手动对数据进行 PKCS7 填充 。
openssl 簇加密方法更为简单明确 , mcrypt 还要将加密算法分为 ciphermode 去指定 , openssl 则只需要直接指定 method 为AES-128-CBC,AES-192-CBC,AES-256-CBC即可 。且提供了三种数据处理模式,即默认模式 0 /OPENSSL_RAW_DATA /OPENSSL_ZERO_PADDING。
openssl 默认的数据填充方式是 PKCS7,为兼容 mcrpty 也提供处理 "0" 填充的数据的模式,具体为下:
options参数即为重要,它是兼容 mcrpty 算法的关键:
options = 0 : 默认模式,自动对明文进行 pkcs7 padding,且数据做 base64 编码处理 。
options = 1 : OPENSSL_RAW_DATA,自动对明文进行 pkcs7 padding, 且数据未经 base64 编码处理 。
options = 2 : OPENSSL_ZERO_PADDING,要求待加密的数据长度已按 "0" 填充与加密算法数据块长度对齐,即同 mcrpty 默认填充的方式一致,且对数据做 base64 编码处理 。注意,此模式下 openssl 要求待加密数据已按 "0" 填充好,其并不会自动帮你填充数据,如果未填充对齐,则会报错 。
故可以得出 mcrpty簇 与 openssl簇 的兼容条件如下:
建议将源码复制到本地运行,根据运行结果更好理解 。
1.二者使用的何种填充算法 。
2.二者对数据是否有 base64 编码要求 。
3.mcrypt 需固定使用 MCRYPT_RIJNDAEL_128,并通过调整 key 的长度 16, 24,32 来实现 ase-128/192/256 加密算法 。
PHP常用加密解密方法作者/上善若水
1.md5(string $str,bool $flag = false);
$flag = false 默认返回32位的16进至数据散列值
$flag = true返回原始流数据
2.sha1($string,$flag = false)
$flag = false 默认返回40位的16进至数据散列值
true返回原始流数据
3.hash(string $algo,srting $str,bool $flag);
$algo : 算法名称 , 可通过hash_algos()函数获取所有hash加密的算法
如:md5,sha1等 , 采用md5,sha1加密所得结果和1,2两种方式结 果相同 。
$flag = false 默认返回16进至的数据散列值 , 具体长度根据算法不同
而不同 。
true返回原始流数据 。
4.crypt(string $str,$string $salt);
函数返回使用 DES、Blowfish 或 MD5 算法加密的字符串 。
具体算法依赖于PHP检查之后支持的算法和$salt的格式和长度 , 当 然具体结果也和操作系统有关 。比较结果采用 hash_equals($crypted,crypt($input,$salt));//且salt值相同
Password_verify($str,$crypted);
5.password_hash ( string $str, integer $algo [, array $options ] )
函数返回哈希加密后的密码字符串, password_hash() 是crypt()的 一个简单封装
$algo : 算法 PASSWORD_DEFAULT ,PASSWORD_BCRYPT
$options = [
“cost”=10,//指明算法递归的层数,
“salt”=“xxadasdsad”//加密盐值,即将被遗 弃 , 采用系统自动随机生成安全性更高
];
使用的算法、cost 和盐值作为哈希的一部分返回
Password_verify($str,$hashed);
6.base64_encode(string $str)
设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层 传输 , 例如电子邮件的主体 。base64_decode(string $encoded)
可以进行解码;
7.mcrypt_encrypt ( string $cipher , string $key , string $data ,
string $mode [, string $iv ] )
mcrypt_decrypt ( string $cipher , string $key , string $crypted ,
string $mode [, string $iv ] )
$ciper:加密算法 , mcrypt_list_algorithms()可以获取该函数所有支持的算法
如MCRYPT_DES(“des”),MCRYPT_RIJNDAEL_128(“rijndael-128”);
$mode : 加密模式 , mcrypt_list_modes()获取所有支持的加密模式,ecb,cbc
$key: 加密的秘钥,mcrypt_get_key_size ( string $cipher , string $mode )
获取指定的算法和模式所需的密钥长度 。$key要满足这个长度,如果长 度无效会报出警告 。
$iv : 加密的初始向量,可通过mcrypt_create_iv ( int $size [, int $source = MCRYPT_DEV_URANDOM ] ) ,
Iv的参数size:
通过mcrypt_get_iv_size ( string $cipher , string $mode )获取
Iv 的参数source:
初始向量数据来源 。可选值有: MCRYPT_RAND (系统随机数生成 器), MCRYPT_DEV_RANDOM (从 /dev/random 文件读取数据) 和MCRYPT_DEV_URANDOM (从 /dev/urandom 文件读取数据) 。在 Windows 平台 , PHP 5.3.0 之前的版本中,仅支持 MCRYPT_RAND 。
请注意,在 PHP 5.6.0 之前的版本中,此参数的默认值 为 MCRYPT_DEV_RANDOM 。
Note: 需要注意的是,如果没有更多可用的用来产生随机数据的信息, 那么 MCRYPT_DEV_RANDOM 可能进入阻塞状态 。
$data : 要加密的字符串数据
php SHA256WithRSA签名验签&加密解密使用:
$pri_key ="";
$pub_key = "";
$char = '方方块儿';//要加密的字符
$sign = $this-RsaEncrypt($char,$pri_key);//加密结果
$result = $this-RsaDecrypt($sign,$pub_key);//对加密结果进行解密
加密:
public function RsaEncrypt($str,$pri_key){
$pi_key =openssl_pkey_get_private($pri_key);
if(!$pi_key)return false;//秘钥不可用
openssl_private_encrypt($str,$encrypted,$pi_key);
$encrypted =base64_encode($encrypted);
return $encrypted;
}
解密:
public function RsaDecrypt($str,$pub_key){
$pu_key =openssl_pkey_get_public($pub_key);
if(!$pu_key)return false;//秘钥不可用
openssl_public_decrypt(base64_decode($str),$decrypted,$pu_key);
return $decrypted;
}
注:开启PHP的php_openssl扩展
PHP 加密:AES & RSA 最近两年一直从事与金融相关项目php数据加密解密的开发与维护 。但是php数据加密解密,关于 PHP 加密解密的最佳实践 , 网上没有人给出一个完美的总结 。恰逢最近看了《图解密码技术》一书,对 PHP 加解密有了更深刻的认识 。
为了避免各位看枯燥的文字理论,开篇我就把总结给出:
一、对称加密
对称加密的特点是加解密速度快 , 加密后的密文强度目前还没有硬解的可能性 。但是,在未来随着计算机性能的提升有可能会出现被破解的可能性 。
对称加密的缺点也很明显 。对称加密的加密过程与解密过程使用的是同一把密钥 。一旦泄漏密钥,加密就失去了任何意义 。
根据《图解密码技术》一书的推荐,对称加密目前推荐使用 AES 。在 PHP 当中要实现 AES 加解密,是使用 openssl 扩展来实现 。所以,请确保你的 PHP 已经开启了 openssl 扩展 。
可以通过如下方式检测:
或者如下方式检测:
AES 的加密模式属于分组密码模式 。所谓分组密码,是加密时把明文按照固定的长度分组,然后再进行加密 。当然,细节之处很很多不同 。AES 分组模式有多种:ECB、CBC、CFB、OFB、CTR 五种分组模式 。目前优先推荐使用 CBC 模式 。
如果使用 CBC 模式 , 那么在加密的时候,就需要一个前置的加密向量 IV 。当初博主在使用 AES 来加密的时候,就很奇怪一个对称加密为何要这个向量 。因为 , 在博主寒冰的潜意识里,对称加密只需要一个密钥就 Ok 了 。没想到 AES 加密还有多种模式,而这个 CBC 模式恰恰就需要一个这样的向量值 。关于这个向量大家可以在网上查阅相关的资料 。这个东西非常重要 , 也非常好理解 。
关于 PHP AES 加解密会用到的相关方法:
AES 支持三种强度:128、192、256 。128 位的强度最低,但是,加密解密速度较快 。256 位强度最高,但是,加密解密速度最低 。所以,大家根据自己系统的重要程度选择使用对应强度 。通常普通的金融项目使用 192 位完整够用了 。顶级的就用 256 位 。其他的就用 128 位吧 。
二、非对称加密
非对称加密是指公钥加密私钥解密,私钥加密公钥解密的算法 。非对称加密的算法有很多 。《图解密码技术》一书推荐使用 RSA 算法 。它使用起来也非常简单 。
要使用 RSA 算法 。首先,我们必须生成一对公钥私钥 。其实生成公钥私钥很简单 。
在 Linux 系统,直接使用如下命令生成:
此命令会生~/.ssh/目录下生成两个文件:
id_rsa是私钥,is_rsa.pub是公钥 。
关于 PHP RSA 加解密会用到的相关方法:
以上就是关于在 PHP 项目开发中 , 我们使用的加密解密算法的一个总结 。博主寒冰在总结过程中难免会有不足之处,还请大家指正!谢谢!
【php数据加密解密 php密码加密技术phpass】php数据加密解密的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于php密码加密技术phpass、php数据加密解密的信息别忘了在本站进行查找喔 。

    推荐阅读