PHP加密方式

PHP加密方式PHP 加密方式分为单项散列加密 对称加密 非对称加密这几类 像常用的 MD5 hash crypt sha1 这种就是单项散列加密 单项散列加密是不可逆的 像 URL 编码 base64 编码这种就是对称加密 是可逆的 就是说加密解密都是用的同一秘钥 除此外就是非对称加密 加密和解密的秘钥不是同一个 如果从安全性而言 加密的信息如果还想着再解密回来 非对称加密无疑是最为安全的方式 MD5 加密 md5 加密算法在 PHP 中是最常见的加密算法 这个算法是不可逆的 通常用于加密用户的密码等信息来保证用户的信息

PHP加密方式分为单项散列加密,对称加密,非对称加密这几类。

像常用的MD5、hash、crypt、sha1这种就是单项散列加密,单项散列加密是不可逆的。

像URL编码、base64编码这种就是对称加密,是可逆的,就是说加密解密都是用的同一秘钥。

除此外就是非对称加密,加密和解密的秘钥不是同一个,如果从安全性而言,加密的信息如果还想着再解密回来,非对称加密无疑是最为安全的方式

 MD5加密

md5加密算法在PHP中是最常见的加密算法,这个算法是不可逆的,通常用于加密用户的密码等信息来保证用户的信息安全。

来自 RFC 1321 的解释 – MD5 报文摘要算法:MD5 报文摘要算法将任意长度的信息作为输入值,并将其换算成一个 128 位长度的”指纹信息”或”报文摘要”值来代表这个输入值,并以换算后的值作为结果。MD5 算法主要是为数字签名应用程序而设计的;在这个数字签名应用程序中,较大的文件将在加密(这里的加密过程是通过在一个密码系统下\[如:RSA\]的公开密钥下设置私有密钥而完成的)之前以一种安全的方式进行压缩。

运用实例:

<?php //这里是一个字符串 $str="this is string"; //通过MD5加密函数加密 $res=md5($str); //在PHP中,MD5()函数还有第二个参数,为bool类型,当为TRUE是返回的加密是16字符原始 //二进制格式字符串,当为FALSE是返回32位的16进制,默认为false,一般都默认 //返回二进制 $res=md5($str,true); `` ?>

 Crypt()加密算法

crypt()加密算法是一种不可逆的加密算法,他有两个参数,一个是需要加密的字符串,另外一个是盐值(或者成为干扰字符串),如果没有指定第二个参数那么将自己随机生成一个干扰字符串并且是以MD5加密的方式。另外这个函数在不同的操作系统上的表现形式也是不一样的,会自动检测。举个例子。

<?php //需要加密的字符串 $str="this is string"; //使用crypt加密,不指定盐值 $res=crypt($str); //指定盐值,但是盐值只能写两位,如果超过了则只会取前两位,在某些系统中会直接返回FALSE $res=crypt($str,'jm'); ?>

sha1加密算法

sha1加密算法和MD5加密算法一样时不可逆的,有两个参数,一个是要加密的字符串,第二个是bool值,如果指定第二个参数为TRUE,则返回二进制格式的字符串,如果不指定则默认为FALSE,返回的是40位的16进制格式的字符串,举个例子

<?php //需要加密的字符串 $str="this is string"; //通过sha1进行加密 $res=sha1($str); //通过指定第二个参数加密 $res=sha1($str,true); ?>

URL编码加密

对于我们的网站,直接暴露给用户的就是地址栏的传参,对于这一部分都是明文的,所以我们可以使用基本的加密算法来简单加密一下,注意,此种方式加密是可逆的,也就是说加密后的密文我们可以解密之后看到,所以如果你想实现真正的加密,并不推荐这个加密算法。

在PHP中对于URL加密解密用到两个函数urlencode和urldecode.

[http://www.baidu.com?name=zhangsan&phone=112](http://www.baidu.com/?name=zhangsan&phone=112)

我们就可以对这段地址进行加密

<?php //需要加密的网址 $str = "http://www.baidu.com?name=zhangsan&phone=112"; //使用urlencode加密 $res = urlencode($str); //使用urldecode解密 $result = urldecode($res); ?>

既然通过这种方式加密解密并且加密之后也并没有什么太大的区别,我们需要他的目的是什么呢?我们想对于想激活成功教程这串加密的字符串可以轻松的激活成功教程,其实这两个函数有他特殊的作用,也就是说除了加密的作用,当然了这是题外话,因为本主题主要是加密,但是作为扩展还是要说一下。

<?php //在HTML传参到后台中的时候如果我们想把&作为参数传到后台,在没有加密之前,浏览器会把他作为 //参数分隔符 //例如:http://www.baidu.com?name=zhangsan&123, 我们想把zhangsan&123作为参数传给 //后台,这个时候直接这样写后台得到的数据却只得到name的值为zhangsan,而123确作为变量 //当然了用一个数字做变量是不合法的,但是浏览器确并不这么智能的区分他 //为了解决这个问题我们就可以对这部分字符编码 $str="http://www.baidu.com?name=".urlencode('zhangsan&123'); //这样我们传过来的值就变成了name = zhangsan&123 ?>

Base64编码加密

大家注意,虽然base64写到本节加密算法中,但是他并不是主要用来加密的,而且从大多数的程序来说,几乎没有人会用他作为加密手段来加密数据,那么他的作用主要是用于做什么呢?这要说的base64加密的机制了。

base64加密本质上说就是把数据转换为ASCLL码,比如一个图片进行base64编码就会变成一堆以Ascll码连接的字符串,这会更有利于文件的传输,当然base64的作用在与文件的传输。例如手机客户端上传文件到服务器,使用base64编码可以轻松实现文件的传输。

base64加密函数

base64_encode($data);

base64解密函数

base64_decode($data);

 hash加密

hash加密也是不可逆的,因为是给定一个不确定的字符串返回特定长度的字符串,这个本质意义上来说实现了单项散列加密。使用方法

hash($ago,$data);

$ago是可以指定加密使用的哈希算法,例如:”md5″,”sha256″,”haval160,4″ 等。

$data是要加密的数据

 Password Hashing API 加密

Password Hashing API是PHP 5.5之后才有的新特性,它主要是提供下面几个函数供我们使用:

password_hash() – 对密码加密.

password_verify() – 验证已经加密的密码,检验其hash字串是否一致.

password_needs_rehash() – 给密码重新加密.

password_get_info() – 返回加密算法的名称和一些相关信息.

虽然说crypt()函数在使用上已足够,但是password\_hash()不仅可以使我们的代码更加简短,而且还在安全方面给了我们更好的保障,所以,现在PHP的官方都是推荐这种方式来加密用户的密码,很多流行的框架比如Laravel就是用的这种加密方式。

$hash = password\_hash($passwod, PASSWORD\_DEFAULT);

对,就是这么简单,一行代码,All done。

PASSWORD\_DEFAULT目前使用的就是Bcrypt,所以在上面我会说推荐这个,不过因为Password Hashing API做得更好了,我必须郑重地想你推荐Password Hashing API。这里需要注意的是,如果你代码使用的都是PASSWORD\_DEFAULT加密方式,那么在数据库的表中,password字段就得设置超过60个字符长度,你也可以使用PASSWORD\_BCRYPT,这个时候,加密后字串总是60个字符长度。

这里使用password\_hash()你完全可以不提供盐值(salt)和 消耗值 (cost),你可以将后者理解为一种性能的消耗值,cost越大,加密算法越复杂,消耗的内存也就越大。当然,如果你需要指定对应的盐值和消耗值,你可以这样写:

$options = [ 'salt' => custom_function_for_salt(), //write your own code to generate a suitable salt 'cost' => 12 // the default cost is 10 ]; $hash = password_hash($password, PASSWORD_DEFAULT, $options); 密码加密过后,我们需要对密码进行验证,以此来判断用户输入的密码是否正确: if (password_verify($password, $hash)) { // Pass } else { // Invalid }

吧,直接使用password\_verify就可以对我们之前加密过的字符串(存在数据库中)进行验证了。

然而,如果有时候我们需要更改我们的加密方式,如某一天我们突然想更换一下盐值或者提高一下消耗值,我们这时候就要使用到password\_needs\_rehash()函数了:

if (password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' => 12])) { // cost change to 12 $hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]); // don't forget to store the new hash! }

只有这样,PHP的Password Hashing API才会知道我们重现更换了加密方式,这样的主要目的就是为了后面的密码验证。

简单地说一下password\_get\_info(),这个函数一般可以看到下面三个信息:

* algo – 算法实例

* algoName – 算法名字

* options – 加密时候的可选参数

AES、DES

PHP简单实现AES加密

namespace app\homeapi\extend\tools; class AES { / * 加密方法 * * @param $str * @param $secret * * @return string */ public static function encrypt($str, $secret) { return base64_encode(openssl_encrypt($str,"AES-128-ECB",$secret,OPENSSL_RAW_DATA)); } / * * 解密方法 * * @param $str * @param $secret * * @return string */ public static function decrypt($str, $secret) { return openssl_decrypt(base64_decode($str),"AES-128-ECB",$secret, OPENSSL_RAW_DATA); } }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230660.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 《王道》数据结构笔记整理2022级_数据结构笔记整理

    《王道》数据结构笔记整理2022级_数据结构笔记整理数据结构第一章绪论1.1数据结构的基本概念1.2数据结构的三要素1.3算法的基本概念1.4算法的时间复杂度1.5算法的空间复杂度第一章绪论1.1数据结构的基本概念1.数据:数据是信息的载体,是描述客观事物属性的数、字符以及所有能输入到计算机中并被程序识别和处理的符号的集合。2.数据元素:数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。例如,学生记录就是一个数据元素,它由学号、姓名、性别等数据项组成。3.数据对象:数

    2022年8月23日
    17
  • 12306可以设置抢票吗_抢票软件哪个成功率高

    12306可以设置抢票吗_抢票软件哪个成功率高#-*-coding:utf-8-*-importrequestsimportreimportbase64fromcodesimportappimportjsonimporturllib.parseimporttimeimportdatetimesession=requests.Session()headers={‘User-Agent’:’Moz…

    2025年12月12日
    3
  • HDU2602 Bone Collector 【01背包】[通俗易懂]

    HDU2602 Bone Collector 【01背包】

    2022年1月21日
    44
  • mac上Latex的安装及使用教程「建议收藏」

    mac上Latex的安装及使用教程「建议收藏」latex的安装官网下载地址:http://tug.org/mactex/以前在Mac上装Tex/LaTeX很麻烦,现在容易多了,只需要下载单个软件包MacTeX.mpkg.zip即可,安装后会在Applications下生成一个Tex目录,Tex/LaTeX编辑器TeXShop,reference工具BibDesk,拼写检查工具Excalibur等都在这个目…

    2022年5月11日
    151
  • centos 7如何将 网卡ens33 修改成 eth0「建议收藏」

    centos 7如何将 网卡ens33 修改成 eth0「建议收藏」文章目录linux网卡名称命名命名规则修改eth0方法linux网卡名称命名命名规则CENTOS6的网卡命名方式它会根据情况有所改变而非唯一且固定,在CENTOS6之前,网络接口使用连续号码命名:eth0、eth1等,当增加或删除网卡时,名称可能会发生变化CENTOS7命名方式采用dmidecode采集命名方案,以此来得到主板信息;它可以实现网卡名字永久唯一化(dmidecode这个命令可以采集有关硬件方面的信息)对网络设备的命名方式:1)如果Firmware(固件)或B

    2025年5月22日
    7
  • UVA 11551 – Experienced Endeavour(矩阵高速幂)[通俗易懂]

    UVA 11551 – Experienced Endeavour(矩阵高速幂)

    2022年2月2日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号