综述:密码学是研究编制密码(我们简称为加密:encode)和破译密码(我们称之为解密:decode)的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。通常情况下,人们将可懂的文本称为明文;将明文变换成的不可懂的文本称为密文。把明文变换成密文的过程叫加密;其逆过程,即把密文变换成明文的过程叫解密。
PHP中提供了哪些数据加密功能?
PHP提供了crypt()函数完成加密功能:  
string crypt (string input_string [, string salt])  
这一函数完成被称作单向加密的功能,也就是说,它可以加密一些明码,但不能够将密码转换为原来的明码。单向加密的口令一旦落入第三方人的手里,由于不能被还原为明文,因此也没有什么大用处。在验证用户输入的口令时,用户的输入采用的也是单向算法,如果输入与存储的经加密后的口令相匹配,则输入的口令一定是正确的。
这个函数的input_string参数是需要加密的字符串,第二个参数salt是一个位字串,它能够影响加密的暗码,进一步地排除被称作预计算攻击的可能性。缺省情况下,PHP使用一个2个字符的DES干扰串,如果你的系统使用的是MD5 ,它会使用一个12个字符的干扰串。我们可以通过执行下面的命令发现系统将要使用的干扰串的长度:
print "系统使用的干扰串的长度是:". CRYPT_SALT_LENGTH;
crypt()支持四种算法,下面是它支持的算法和相应的salt参数的长度:
[注:以下用表格]
算法 Salt长度
CRYPT_STD_DES 2-character (默认)
CRYPT_EXT_DES 9-character
CRYPT_MD5 12-character beginning with $1$
CRYPT_BLOWFISH 16-character beginning with $2$
怎样将PHP的数据加密功能应用于用户验证?
我们用crypt()实现用户身份验证。比如我们用一段PHP程序限制对一个目录的访问,只允许注册用户访问这一目录。我们把资料存储MySQL数据库的一个表(这个数据表名为members)中:
mysql>CREATE TABLE members (
->username CHAR(14) NOT NULL,
->password CHAR(32) NOT NULL,
->PRIMARY KEY(username)
->);
然后,我们可以输入用户的数据到该表中:
用户名 密码
Tom keloD1C377lKE
John ba1T7vnz9AWgk
Bill paLUvRWsRLZ4U
这些加密的口令对应的明码分别是Tom、John和Bill。我们将根据口令的前二个字母创建干扰串:
$enteredPassword.
$salt = substr($enteredPassword, 0, 2);
$userPswd = crypt($enteredPassword, $salt);
// $userPswd然后就和用户名一起存储在MySQL 中
crypt()和Apache的口令-应答验证系统的应用  
<?php
$host = "localhost"; //主机
$username = "Tom"; //用户名
$passwd = "Hello world"; //密码
$db = "users"; //数据库名
// 设置是否通过验证标志,默认为否
$authorization = 0;
// 提示用户输入帐号和密码
if (isset($PHP_AUTH_USER) && isset($PHP_AUTH_PW)){
mysql_pconnect($host, $username, $passwd) or die("不能连接到MySQL服务器!");
mysql_select_db($db) or die("不能选择数据库!");
// 进行加密
$salt = substr($PHP_AUTH_PW, 0, 2);
$encrypted_pswd = crypt($PHP_AUTH_PW, $salt);
//SQL查询语句
$query = "SELECT username FROM members WHERE username = `$PHP_AUTH_USER` AND password = `$encrypted_pswd`";
// 执行查询
if (mysql_numrows(mysql_query($query)) == 1) {
$authorization = 1;
}
}
if (! $authorization){
header(`WWW-Authenticate: Basic realm="用户验证"`);
header(`HTTP/1.0 401 Unauthorized`);
print "无法通过验证";
exit;
}else {
print "已经加密";
}
?>
在缺省状态下使用的 crypt()并不是最安全的,所以如果需要较高的安全性能,就需要其他更好的算法,比如md5(),这一函数使用MD5散列算法。
如何通过MD5方式进行加密?
PHP中通过MD5方式加密的函数有md5(),它的一个作用是混编。
一个混编函数可以将一个可变长度的信息变换为具有固定长度被混编过的输出,也被称作"信息文摘",这是十分有用的,因为 一个固定长度的字符串可以用来检查文件的完整性和验证数字签名与用户身份。PHP内置的md5()混编函数将把一个可变长度的信息转换为128位(32个字符)的信息文摘。混编的一个有趣的特点是:不能通过分析混编后的信息得到原来的明码,因为混编后的结果 与原来的明码内容没有依赖关系。即便只改变一个字符串中的一个字符,也将使得MD5混编算法计算出二个截然不同的结果。我们首先来看下表的内容及其相应的结果:
使用md5()混编字符串
<php
$input = "Hello,PHP world!";
$output = md5($input);
print "输出: $output ";
?>
结果:
输出: 7996b5e0804042fd531907a4900f190e
注意,结果的长度为32个字符。我们把$input的值稍微改变一下:
使用md5()对一个稍微变化的字符串进行混编
<?php
$input = "Hello,PHP World!";
$output = md5($input);
print "输出: $output ";
?>
结果:
hash2: f0456d48ed06a5c35b1e42561fa7a016

可以发现,尽管二个结果的长度都是32个字符,但明文中一点微小的变化使得结果发生了很大的变化,我们可以利用这个特点来检查数据中微小变化。

PHP中的MD5加密相关推荐

  1. vue中使用MD5加密

    在vue中使用MD5加密  安装:  使用npm npm install --save blueimp-md5 <script src="http://cdn.bootcss.com/ ...

  2. java对密码进行加密的方法_如何在JAVA中使用MD5加密对密码进行加密

    如何在JAVA中使用MD5加密对密码进行加密 发布时间:2020-11-25 17:12:40 来源:亿速云 阅读:118 作者:Leah 本篇文章为大家展示了如何在JAVA中使用MD5加密对密码进行 ...

  3. java中的md5加密_java中的MD5加密

    java中的MD5加密 2016-01-22 09:07:00 admin 原创 1144 摘要:java中的MD5加密 /** * * md5加密 * @author LiuJiawan * @da ...

  4. vue中 使用md5加密

    安装 npm install js-md5 --save 组件内引入 需要的组件内引用 import md5 from 'js-md5'; 使用 let psd = '123123' md5(psd) ...

  5. java中md5加密和解密_如何在java中实现md5加密和解密

    如何在java中实现md5加密和解密 关注:273  答案:1  mip版 解决时间 2021-01-19 20:37 提问者精神疯裂 2021-01-19 05:36 如何在java中实现md5加密 ...

  6. ios android md5加密,iOS中使用MD5加密

    在iOS中使用MD5加密较简单,需要引入头文件CommonCrypto/CommonDigest.h,我们单独新建一个用于MD5加密的类Encryption,此类继承NSObject. Encrypt ...

  7. android php md5加密解密,Android中的md5加密怎么与php md5加密保持一致

    Android中的md5加密怎么与php md5加密保持一致 发布时间:2020-12-05 15:27:37 来源:亿速云 阅读:72 作者:Leah 这期内容当中小编将会给大家带来有关Androi ...

  8. java中完成md5加密解密_java实现md5加密解密 notNET中加密和解密的实现方法

    java实现md5加密解密 notNET中加密和解密的实现方法 亦或是旅途风光 7-14 1918℃ 22 [ ee21.cn - ASP.NET ] .NET将原来独立的API和SDK合并到一个框架 ...

  9. asp.net中的MD5加密

    其实在ASP.Net编程中,不用调用md5.asp来加密数据.在DotNet中有自带的类:System.Web.Security.HashPasswordForStoringInConfigFile( ...

  10. python3 中的 md5 加密

    转载申明:https://blog.csdn.net/m0_38080253/article/details/78838489 在python3的标准库中,已经移除了md5,而关于hash加密算法都放 ...

最新文章

  1. Failed to instantiate one or more classes
  2. python使用statsmodels包中的tsaplots函数和lags参数可视化时间序列数据指定滞后位置个数(级别)以前的所有自相关性(plot the autocorrelation)
  3. CMMI过程域-MA度量和分析
  4. 1.5 Hello, world! 解剖 -JSF实战 -hxzon -jsf学习笔记
  5. 最佳实践|Spring Boot 应用如何快速接入 Prometheus 监控
  6. OpenGL 自定义着色器(Shaders)
  7. 第几天? 2005
  8. 类和对象在JVM中是如何存储的,竟然有一半人回答不上来!
  9. Linux系统调用表(system call table)
  10. 关于map的几种非常规排序
  11. go语言导出oracle数据,Go语言导出内容到Excel的方法
  12. C/C++ 程序设计员应聘常见面试试题深入剖析(2)
  13. 高斯函数表达式C语言,C语言计算高斯核函数
  14. 【C语言程序】鸡兔同笼问题
  15. runaction 旋转_使用cc.tween(缓动系统)代替runAction
  16. 从Outlook到python都可以使您的工作减少一半
  17. matlab ols regress,计量经济学简单线性回归OLS的Matlab程序.pdf
  18. c语言课程设计三色球问题,C++三色球问题描述与算法分析
  19. 剑指offe JZ18 删除链表的节点
  20. RecycleView刷新 齿轮转动动画效果

热门文章

  1. linux内核sscanf,linux sscanf_s
  2. Python - 装机系列61 mbp14寸安装(迁移)
  3. Cross Apply的用法
  4. 安装nodejs踩的雷
  5. SIGPIPE信号的产生及处理
  6. 漏洞复现 | Apache Shiro 授权绕过漏洞(CVE-2022-32532)
  7. 烟台移动dns网关_山东烟台DNS
  8. Delphi调用外部程序函数:WinExec() 和ShellExecute详解
  9. VS WinExec 打开cmd执行命令
  10. 常见打印问题解决方案【合集】