$flag = true ?返回原始流数据
true ?返回原始流数据
$algo : 算法名称,可通过hash_algos()函数获取所有hash加密的算法
而不同.
true ?返回原始流数据.
具体算法依赖于PHP检查之后支持的算法和$salt的格式和长度,当 然具体结果也和操作系统有关.比较结果采用 hash_equals($crypted,crypt($input,$salt));//且salt值相同
Password_verify($str,$crypted);
函数返回哈希加密后的密码字符串, password_hash() 是crypt()的 一个简单封装
$algo : 算法 PASSWORD_DEFAULT ,PASSWORD_BCRYPT
$options = [
"cost"=10,//指明算法递归的层数,
"salt"="xxadasdsad"//加密盐值,即将被遗 弃,采用系统自动随机生成安全性更高
];
使用的算法、cost 和盐值作为哈希的一部分返回
Password_verify($str,$hashed);
可以进行解码;
string $mode [, string $iv ] )
mcrypt_decrypt ( string $cipher , string $key , string $crypted ,
$ciper:加密算法,mcrypt_list_algorithms()可以获取该函数所有支持的算法
$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:
Note: 需要注意的是,如果没有更多可用的用来产生随机数据的信息, 那么 MCRYPT_DEV_RANDOM 可能进入阻塞状态.
$data : 要加密的字符串数据
对称加解密算法中,当前最为安全的是 AES 加密算法(以前应该是是 DES 加密算法),PHP 提供了两个可以用于 AES 加密算法的函数簇: Mcrypt 和 OpenSSL .
在一些场景下,我们不能保证两套通信系统都使用了相函数簇去实现加密算法,可能 siteA 使用了最新的 OpenSSL 来实现了 AES 加密,但作为第三方服务的 siteB 可能仍在使用 Mcrypt 算法,这就要求我们必须清楚 Mcrypt 同 OpenSSL 之间的差异,以便保证数据加解密的一致性.
协同好以上两点,就可以让 Mcrypt 和 OpenSSL 之间一致性的对数据进行加解密.
AES 是当前最为常用的安全对称加密算法,关于对称加密这里就不在阐述了.
AES 有三种算法,主要是对数据块的大小存在区别:
Mcrypt 的默认填充算法.NUL 即为 Ascii 表的编号为 0 的元素,即空元素,转移字符是 "\0",PHP 的 pack 打包函数在 'a' 模式下就是以 NUL 字符对内容进行填充的,当然,使用 "\0" 手动拼接也是可以的.
默认使用 NUL("\0") 自动对待加密数据进行填充以对齐加密算法数据块长度.
获取 mcrypt 支持的算法,这里我们只关注 AES 算法.
options 参数即为重要,它是兼容 mcrpty 算法的关键:
故可以得出 mcrpty簇 与 openssl簇 的兼容条件如下:
建议将源码复制到本地运行,根据运行结果更好理解.
①二者使用的何种填充算法.
第一段:无需任何PHP扩展的加密
此类加密的代表有 威盾PHP加密专家、PHP在线加密平台、PHP神盾 等.
此类加密都是以eval函数为核心,辅以各式各样的字符串混淆和各种小技巧,来达到加密目的(更准确的说,应该算是混淆).下面以一个简单的hello world为例来说明此类加密的大体过程.
php
echo "hello world";
首先 ,我们把这段代码变为通过eval执行的
eval('echo "hello world";');
就这样子,我们的第一个加密过的php代码新鲜出炉了...
上面这个例子非常非常简单,基本上任何有一点php语言基础甚至别的语言基础的人都能轻松的看懂并解密.所以呢,我们需要一些方法让这个加密至少看上去不是那么简单.
第二段:同时采用多种编码函数
这儿所说的特定字符是一些极其相似的字符,如I和1,0和O.试想一下满屏都是O和0组成的变量,并且每一个的名字长度都在10个字符以上... 判断文件自身是否被修改
这个功能看似容易,对文件做一下摘要再进行下对比即可知道是否被修改了,但是如何才能在文件内把摘要嵌入进去呢?我没有找到完美的方案,但一个变通的方案还是很容易的...
exit('file edited');
}
当然,你可以把这个校验字符串放在别的位置来提高破解的难度.有了这个,别人想破解你的程序可就得多费一点功夫了...
既然知道了原理,那解密自然也就非常简单了,总体来说就三步:
把eval替换为输出,比如echo 根据编码规则把字符串还原 如果文件未解密完全,从第一步开始继续