PHP加密技术的简单实现


Posted in PHP onSeptember 04, 2016

一、MD5加密

直接干,这里以一个登录页面为例:

<?php
require_once 'config/database.config.php';

$act=$_REQUEST['act'];
$username=$_POST['username'];
$password=md5($_POST['password']);

if ($act=='reg') {
  $sql="INSERT INTO user(username,password) VALUES('{$username}','{$password}')";
  $result=mysqli_query($link, $sql);
  
  if ($result) {
    echo "Success";
    echo "<meta http-equiv='refresh' content='1;url=login.html'/>";
  }else {
    echo "Failure!";
    echo "<meta http-equiv='refresh' content='1;url=reg.html'/>";
  }
}elseif ($act=='login') {
  $sql="SELECT * FROM user WHERE username='{$username}' AND password='{$password}'";
  $result=mysqli_query($link, $sql);
  $validate=mysqli_fetch_array($result);
  //var_dump($validate);
  if ($validate) {
    echo "success";
    echo "<meta http-equiv='refresh' content='1;url=http://www.baidu.com'/>";
  }else {
    echo "failure";
    echo "<meta http-equiv='refresh' content='1;url=login.html'/>";
  }
}

主要就是记得比对的时候也使用MD5,所以存在数据库中的时候就是密码保存的了

mysql> SELECT * FROM user;
+----+----------+----------------------------------+
| id | username | password             |
+----+----------+----------------------------------+
| 1 | 123   | d41d8cd98f00b204e9800998ecf8427e |
| 2 | 123   | 5e12a8f9c9e959060fdcaea165393039 |
| 3 |     | d41d8cd98f00b204e9800998ecf8427e |
| 4 | root   | 202cb962ac59075b964b07152d234b70 |
| 5 | root   | 0c51f0ba4316a5c844397f69effe2d01 |
+----+----------+----------------------------------+

二、Crypt加密算法

同样是一个单向加密算法,无法由密文直接得到明文密码(和MD5一样);

语法:string crypt(string $str[,string $salt]),$str为加密明文,$salt为干扰项,可以理解为椒盐噪声;

/**
 * Crypt
 */
echo crypt('shit');
echo "<hr/>";
echo crypt('shit','im');
echo "<hr/>";
if (CRYPT_EXT_DES) {
  echo crypt('shit','this is a test');
}
echo "<hr/>";
if (CRYPT_MD5) {
  echo crypt('shit','$1$this is a test$');
}

基本没什么要说的,就一点,crypt的加密有不同的加密算法,默认的是MD5加密,但是若是不给定“盐值”,每次刷新,都是不一样的结果;

然后可以指定盐值,具体参见手册,每个算法的盐值长度是不一样的,比如上述的DES和MD5,结果如下

1223b8c30a347321299611f873b449ad
$1$ed0.Ph..$fPbfhSOMLyNdtZn9krT8X/
im37cLeO/JPaQ
th12A1V7QCns.
$1$this is $Bu9FE8Y8oGnIbftjDA4ez0

DES只能取两位,而MD5取了8位;

用法上也差不多,记得输入盐值才好。

三、Sha1

同样是单向加密,不可破解(但网上的办法都是类似数据库一样的“伪暴力”破解);

与MD5的区别在于返回更长的(40位)16进制的数串(MD5是32位);

/**
 * Sha1
 */
echo "<hr/>";
echo sha1('shit');
echo "<hr/>";
echo sha1('shit',true);  
echo "<hr/>";
echo sha1('admin');

所以,一般加密保存,不要单独使用这些密码,不如这样子混合使用

echo "<hr/>";
echo sha1(sha1('admin',true));
echo "<hr/>";
echo sha1(md5('admin'));

等于是加密外面又自行进行了简单的加密!!

四、URL编码加密

对地址栏信息进行加密;

双向,urlencode和urldecode;

/**
 * URL编码加密
 */

$str="this is a test";
$result=urlencode($str);
echo $result;
echo "<hr/>";
echo urldecode($result);
echo "<hr/>";
$str="login.php?username=shit&action=act%3 hape#123\\";
echo urlencode($str);
echo "<hr/>";

echo "<a href='index.php?username=shit&gender=male'>Shit Login</a>";
print_r($_GET);
echo "<hr/>";
//所以地址栏进行一下编码,一方面是保密,一方面是处理特殊情况
//比如username&shit是一个整体,不编码的话,浏览器是看不出的
echo "<a href='index.php?username=username&shit&gender=male'>Shit Login2</a>";
print_r($_GET);
echo "<hr/>";
$str="username&shit";
$str2="username=".urlencode($str)."&gender=".urlencode("male");
echo "<a href='index.php?".$str2."'>Shit Login3</a>";
print_r($_GET);
echo "<hr/>";
//baidu example
//https://www.baidu.com/s?ie=utf8&wd=url%E7%BC%96%E7%A0%81%E5%8A%A0%E5%AF%86&tn=87048150_dg
//search url编码

结果如下

this+is+a+test
this is a test
login.php%3Fusername%3Dshit%26action%3Dact%253+hape%23123%5C
Shit LoginArray ( [username] => username&shit [gender] => male ) 
Shit Login2Array ( [username] => username&shit [gender] => male ) 
Shit Login3Array ( [username] => username&shit [gender] => male )

所以功能就是:地址栏更加安全,不再明文传输,另一个解决特殊情况的传递

五、Base64编码加密

其实base64不是加密技术,只不过他会对data进行base64的编码,也可以看做是一种加密技术;

/**
 * Base64
 */

$data="I am king";
echo base64_encode($data);
echo "<hr/>";
echo base64_decode(base64_encode($data));
echo "<hr/>";
echo base64_encode("中文测试");
echo "<hr/>";
// echo base64_decode("R0lGODlhAQABAIAAAP///wAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==");
$data=file_get_contents("0.jpg");
echo base64_encode($data);

 等于说是对内容进行加密

总结

单项散列加密:得到固定长度的输出,是单向的;

对称散列加密:使用同一把密钥进行加密解密,可以相互推算;(算法简单,效率高,开销小,适合对大量数据进行加密)DES等

非对称加密技术:密钥不一样,公钥和私钥之分

以上这篇PHP加密技术的简单实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
用PHP调用数据库的存贮过程
Oct 09 PHP
一个oracle+PHP的查询的例子
Oct 09 PHP
一个域名查询的程序
Oct 09 PHP
防止MySQL注入或HTML表单滥用的PHP程序
Jan 21 PHP
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
May 29 PHP
PHP容易被忽略而出错陷阱 数字与字符串比较
Nov 10 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
Nov 17 PHP
PHP获取photoshop写入图片文字信息的方法
Mar 31 PHP
PHP 常用的header头部定义汇总
Jun 19 PHP
PHP实现批量修改文件后缀名的方法
Jul 30 PHP
PHP对象、模式与实践之高级特性分析
Dec 08 PHP
PHP filesize函数用法浅析
Feb 15 PHP
PHP简单检测网址是否能够正常打开的方法
Sep 04 #PHP
PHP简单字符串过滤方法示例
Sep 04 #PHP
windows7配置Nginx+php+mysql的详细教程
Sep 04 #PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
Sep 02 #PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
Sep 01 #PHP
PHP数组编码gbk与utf8互相转换的两种方法
Sep 01 #PHP
Yii2框架数据库简单的增删改查语法小结
Aug 31 #PHP
You might like
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
PHP将session信息存储到数据库的类实例
2015/03/04 PHP
记录一次排查PHP脚本执行卡住的问题
2016/12/27 PHP
详解PHP swoole process的使用方法
2017/08/26 PHP
javascript firefox不显示本地预览图片问题的解决方法
2008/11/12 Javascript
javascript 动态数据下的锚点错位问题解决方法
2008/12/24 Javascript
jquery 多行滚动代码(附详细解释)
2010/06/17 Javascript
js判断是否为数组的函数: isArray()
2011/10/30 Javascript
javascript模块化是什么及其优缺点介绍
2013/09/02 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
html5+javascript实现简单上传的注意细节
2016/04/18 Javascript
浅析创建javascript对象的方法
2016/05/13 Javascript
JS实现简单抖动效果
2017/06/01 Javascript
BootStrap入门学习第一篇
2017/08/28 Javascript
jQuery动态添加.active 实现导航效果代码思路详解
2017/08/29 jQuery
深入理解 Koa 框架中间件原理
2018/10/18 Javascript
js实现右键弹出自定义菜单
2020/09/08 Javascript
[02:08]我的刀塔不可能这么可爱 胡晓桃_1
2014/06/20 DOTA
[02:30]辉夜杯主赛事第二日胜者组半决赛 CDEC.Y赛后采访
2015/12/26 DOTA
[45:52]2018DOTA2亚洲邀请赛 4.1小组赛 A组加赛 LGD vs Liquid
2018/04/02 DOTA
深入讲解Python函数中参数的使用及默认参数的陷阱
2016/03/13 Python
Python实现获取磁盘剩余空间的2种方法
2017/06/07 Python
python中文编码与json中文输出问题详解
2018/08/24 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
2019/08/20 Python
Django 自动生成api接口文档教程
2019/11/19 Python
python将数组n等分的实例
2019/12/02 Python
Django配置Bootstrap, js实现过程详解
2020/10/13 Python
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
高中生自我评价个人范文
2013/11/09 职场文书
2015年餐厅服务员工作总结
2015/04/23 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
党小组鉴定意见
2015/06/02 职场文书
2016基督教会圣诞节开幕词
2016/03/04 职场文书
对Keras自带Loss Function的深入研究
2021/05/25 Python
SpringBoot工程下使用OpenFeign的坑及解决
2021/07/02 Java/Android