PHP学习笔记——加密解密

2023-10-27

一、MD5算法
MD5消息摘要算法(Message Digest Algorithm)是R.Rivest设计的,它对输入的任意长度的消息进行运算,产生一个128位的消息摘要。随着穷举攻击和密码分析的发展,MD5算法已经不再那么流行了。
1、算法原理
1)数据填充
填充消息使其与448模512同余(长度 ≡ 448 mod 521),即填充后的消息长度是比512的倍数仅小64位的数。即使消息长度本身已经符号上述长度,仍然需要填充(填充方法是附一个1在消息后面,然后用0来进行填充,直到消息的长度与448模512同余)。至少填充1位,至多填充512位。
2)添加长度
在数据填充的结果之后附上64位的消息长度。如果填充前消息的长度大于2^64,则只使用其低64位。添加完填充位和消息长度之后,最终的消息长度是512的整数倍。
3)初始化变量
初始化4个变量(A=0x67452301,B=0xEFCDAB89,C=0x98BADCFE,D=0x10325476,分别都是一个32位的寄存器)来计算消息摘要,并且以小端形式来存放,即如下:
01 23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10
4)数据处理
4个辅助函数:
F(X,Y,Z) = (X&Y)|((~X)&Z)
G(X,Y,Z) = (X&Z)|(Y&(~Z))
H(X,Y,Z) = X ^ Y ^ Z
I(XY,Z) = Y ^ (X|(~Z))
把消息分以512位为一分组进行处理,每一个分组进行4轮变换,以上面所说4个常数为起始变量进行计算,重新输出4个变量,以这4个变量再进行下一分组的运算,如果已经是最后一个分组,则这4个变量为最后的结果,即MD5值。
具体代码实现可参考MD5算法MD5加密算法原理及实现

二、SHA1算法和DES算法
SHA1算法参考SHA1算法实现及详解
DES算法参考DES算法原理完整版

三、MIME/BASE64算法
MIME是多部分、多媒体电子邮件、WWW超文本的一种编码标准,用于传送图形、声音和传真等非文本数据。MIME定义于RFC1341,用MIMEENCODE方法将二进制数据转换为一种被称为BASE64的ASCII子集的字符的组合。MIME/BASE64将字符流存放入一个24位的缓冲区,缺字符的地方补零,然后将缓冲区截断为4个部分,高位在先,每个部分6位,用下面的64个字符重新表示:“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”。如果输入只有一个或两个字节,那么输出将用“=”补足,这样可以隔断附加信息造成编码的混乱。

四、PHP内置加密函数
1、单向字符串散列
string crypt ( string str [, string salt ] )
返回一个基于标准 UNIX DES 算法或系统上其他可用的替代算法的散列字符串。
str是需要加密的字符串,salt是加密时使用的干扰串。如果省略salt,则会随机生成一个干扰串。
在 crypt() 函数支持多重散列的系统上,下面的常量根据相应的类型是否可用被设置为 0 或 1:
CRYPT_STD_DES - 基于标准 DES 算法的散列使用 “./0-9A-Za-z” 字符中的两个字符作为盐值。在盐值中使用非法的字符将导致 crypt() 失败。
CRYPT_EXT_DES - 扩展的基于 DES 算法的散列。其盐值为 9 个字符的字符串,由 1 个下划线后面跟着 4 字节循环次数和 4 字节盐值组成。它们被编码成可打印字符,每个字符 6 位,有效位最少的优先。0 到 63 被编码为 “./0-9A-Za-z”。在盐值中使用非法的字符将导致 crypt() 失败。
CRYPT_MD5 - MD5 散列使用一个以 1 1 1 开始的 12 字符的字符串盐值。
CRYPT_BLOWFISH - Blowfish 算法使用如下盐值:“ 2 a 2a 2a”,一个两位 cost 参数,“$” 以及 64 位由 “./0-9A-Za-z” 中的字符组合而成的字符串。在盐值中使用此范围之外的字符将导致 crypt() 返回一个空字符串。两位 cost 参数是循环次数以 2 为底的对数,它的范围是 04-31,超出这个范围将导致 crypt() 失败。 PHP 5.3.7 之前只支持 “ 2 a 2a 2a” 作为盐值的前缀,PHP 5.3.7 开始引入了新的前缀来修正一个在Blowfish实现上的安全风险。可以参考» this document来了解关于这个修复的更多信息。总而言之,开发者如果仅针对 PHP 5.3.7及之后版本进行开发,那应该使用 “ 2 y 2y 2y” 而非 “ 2 a 2a 2a
CRYPT_SHA256 - SHA-256 算法使用一个以 5 5 5 开头的 16 字符字符串盐值进行散列。如果盐值字符串以 “rounds=$” 开头,N 的数字值将被用来指定散列循环的执行次数,这点很像 Blowfish 算法的 cost 参数。默认的循环次数是 5000,最小是 1000,最大是 999,999,999。超出这个范围的 N 将会被转换为最接近的值。
CRYPT_SHA512 - SHA-512 算法使用一个以 6 6 6 开头的 16 字符字符串盐值进行散列。如果盐值字符串以 “rounds=$” 开头,N 的数字值将被用来指定散列循环的执行次数,这点很像 Blowfish 算法的 cost 参数。默认的循环次数是 5000,最小是 1000,最大是 999,999,999。超出这个范围的 N 将会被转换为最接近的值。

PHP 设置了一个名为 CRYPT_SALT_LENGTH 的常量,用来表示可用散列允许的最长可用盐值。

2、计算字符串的 MD5 散列值
string md5 ( string str [, bool raw_output = FALSE ] )
以 32 字符十六进制数字形式返回散列值。
参数str是原始字符串。
如果可选的 raw_output 被设置为 TRUE,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。

3、计算字符串的 sha1 散列值
string sha1 ( string str [, bool raw_output = false ] )
参数str是输入字符串。
如果可选的 raw_output 参数被设置为 TRUE, 那么 sha1 摘要将以 20 字符长度的原始格式返回, 否则返回值是一个 40 字符长度的十六进制数字。

4、使用 MIME base64 对数据进行编码
string base64_encode ( string data )
成功返回编码后的字符串数据, 失败时返回 FALSE。
设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层传输,例如电子邮件的主体。Base64-encoded 数据要比原始数据多占用 33% 左右的空间。

5、对使用 MIME base64 编码的数据进行解码
string base64_decode ( string data [, bool strict = false ] )
返回原始数据, 或者在失败时返回 FALSE。返回的数据可能是二进制的。
参数data是编码过的数据。
参数strict是可选的,当设置 strict 为 TRUE 时,一旦输入的数据超出了 base64 字母表,将返回 FALSE。 否则会静默丢弃无效的字符。

五、加密扩展库Mcrypt和Mhash
Mcrypt扩展库可以实现加密解密功能;Mhash扩展库包含了多种hash算法实现的混编函数。
Mcrypt的具体用法参见PHP手册Mcrypt
Mhash的具体用法参见PHP手册Mhash

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP学习笔记——加密解密 的相关文章

  • so库的反编译,反汇编

    Linux APP SO的反汇编工具 ida Pro 可以反汇编app和SO库 有函数名 但是不能反编译到code这一级别 下载最强的反编译工具 ida Pro 6 4 Plus rar 还有这个反汇编工具 没用过 转自 http bbs
  • PHP学习笔记——加密解密

    一 MD5算法 MD5消息摘要算法 Message Digest Algorithm 是R Rivest设计的 它对输入的任意长度的消息进行运算 产生一个128位的消息摘要 随着穷举攻击和密码分析的发展 MD5算法已经不再那么流行了 1 算
  • Python 中 import 的机制与实现

    转自 http python jobbole com 82604 本文所涉及到的代码在github上 概述 Python 是一门优美简单 功能强大的动态语言 在刚刚接触这门语言时 我们会被其优美的格式 简洁的语法和无穷无尽的类库所震撼 在真
  • boost::bind 详解

    转自 https www cnblogs com benxintuzi p 4862129 html boost bind是标准库函数std bind1st和std bind2nd的一种泛化形式 其可以支持函数对象 函数 函数指针 成员函数
  • Unity3D protobuf-net使用方式

    1 下载protobuf net 2 创建Unity工程 创建一个Plugins文件夹 将protobuf net解压把里面得protobuf net放到Plugins 3 创建一个名为mcs的文本文件 里面写上 unsafe 4 重启Un
  • 需要注意字节序的大端(big endian)和小端(little endian)的几种情景

    大端 big endian 在内存中 按照从最低有效字节到最高有效字节的顺序存储对象 即数据的高字节 保存在内存的低地址中 而数据的低字节 保存在内存的高地址中 小端 little endian 在内存中 按照从最高有效字节到最低有效字节的
  • linux shell 编程

    转自 http blog csdn net fpmystar article details 4183678 和 http blog csdn net buutterfly article details 6615162 在进行linux测
  • C++智能指针简单剖析

    转自 https www cnblogs com lanxuezaipiao p 4132096 html 导读 最近在补看 C Primer Plus 第六版 这的确是本好书 其中关于智能指针的章节解析的非常清晰 一解我以前的多处困惑 C
  • C++ STL之vector用法总结

    转自 https www cnblogs com zhonghuasong p 5975979 html 介绍 vector是表示可变大小数组的序列容器 就像数组一样 vector也采用的连续存储空间来存储元素 也就是意味着可以采用下标对v
  • 机器学习——深度学习(Deep Learning)

    Deep Learning是机器学习中一个非常接近AI的领域 其动机在于建立 模拟人脑进行分析学习的神经网络 最近研究了机器学习中一些深度学习的相关知识 本文给出一些很有用的资料和心得 Key Words 有监督学习与无监督学习 分类 回归
  • 广度/宽度优先搜索(BFS)

    转自 https blog csdn net raphealguo article details 7523411 1 前言 广度优先搜索 也称宽度优先搜索 缩写BFS 以下采用广度来描述 是连通图的一种遍历策略 因为它的思想是从一个顶点V
  • 理解CPU/寄存器/内存之间的关系

    转自 https blog csdn net qq 27689785 article details 82975575 CPU 寄存器 内存 因为要了解多线程 自然少不了一些硬件知识的科普 我没有系统学习过硬件知识 仅仅是从书上以及网络上看
  • R与SPSS、SAS相比较_Python 在数据分析工作中的地位与R语言、SAS、SPSS 比较如何?

    转自 http m elecfans com article 611407 html 统计分析的软件和程序分析 能够用来做统计分析的软件和程序很多 目前应用比较广泛的包括 SPSS SAS R语言 Matlab S PLUS S Miner
  • C/C++编程笔记:C++中的指针与引用,又在什么时候使用?

    C和C 支持与大多数其他编程语言不同的指针 其他语言包括C Java Python Ruby Perl和PHP 从表面上看 引用和指针非常相似 都用于使一个变量提供对另一变量的访问 两者都提供了许多相同的功能 因此通常不清楚这些不同机制之间
  • unique_ptr的使用和陷阱

    转自 https blog csdn net qq 33266987 article details 78784286 unique ptr的使用 分配内存 与shared ptr不同 unique ptr没有定义类似make shared
  • make时遇到File `Makefile' has modification time 4e+04 s in the future的解决办法

    1 原因 是虚拟机时间和电脑时间不匹配造成 2 解决办法 在VMware 菜单虚拟机 M gt 设置 S gt 选项下设置开启时间同步 然后重启虚拟机 3 若还出现 warning Clock skew detected Your buil
  • 24时区来源,CST,CET,UTC,DST,Unix时间戳概述、关系、转换

    全球24个时区的划分 相较于两地时间表 显示世界各时区时间和地名的世界时区表 Universal WorldTime 就显得精密与复杂多 通常世界时区表的表盘上会标示着全球24个时区的城市名称 全球24个时区是如何产生的 过去世界各地原本各
  • C++11的时间新特性之high_resolution_clock

    转自 https blog csdn net cw hello1 article details 66476290 我在这里只是说一说high resolution clock的时间用法 这里有一个C 的网上的API地址 包含了C 11的新
  • C++回顾——引用和拷贝构造函数

    一 C 中的指针 C和C 指针的最重要的区别在于C 是一种类型要求更强的语言 C不允许随便地把一个类型的指针赋值给另一个类型 但允许通过void 来实现 C 不允许这样做 如果真想把某种类型当做别的类型处理 则必须显示地使用类型转换 二 C
  • 开源软件许可证—GPL、AGPL、LGPL、Apache、ZLIB/LIBPNG、MIT

    转自 http www dushibaiyu com 2013 08 E5 BC 80 E6 BA 90 E8 BD AF E4 BB B6 E8 AE B8 E5 8F AF E8 AF 81 gpl E3 80 81agpl E3 80

随机推荐

  • 最大连续区间和C++

    在求连续区间的最大和是一种动态规划的常见例题 那么如何能快速求算得一个长度为n的数组的最大连续区间和 第一反应当然是 通过暴力计算每一个区间的和进而求其最大值 但时间复杂度到达了不可接受的O n 2 而比较好的算法如下 include
  • 软件质量属性:可测试性

    测试的目的 尽可能多地发现软件中存在的BUG 不符合需求的部分或者是未实现的需求 测试的意义 尽可能确保软件正式上线运行后不出现问题 减少潜在的风险和损失 可测试性定义 指软件测试的难易度和效率 如果测试结果越直观 测试效率越高 可测试性就
  • 【100天精通Python】Day55:Python 数据分析_Pandas数据选取和常用操作

    目录 Pandas数据选择和操作 1 选择列和行 2 过滤数据 3 添加 删除和修改数据 4 数据排序 Pandas数据选择和操作 Pandas是一个Python库 用于数据分析和操作 提供了丰富的功能来选择 过滤 添加 删除和修改数据 1
  • VUE element-ui之table表格内容样式(颜色)修改

    要求将表格中的负数显示为红色 实现步骤 定义样式方法
  • Motion Partition

    Object Boundary Based motion partition scheme e is the best approximate of foreground picture but wastes coding d is a t
  • qt打包生成exe_Qt-Installer-Framework使用(一)

    Qt Installer Framework 以下简称QIFW 是 Qt 官方出品的一款功能强大的打包工具 可以满足我们日常使用中大部分需求 环境说明 OS Qt MinGW QIFW Windows7 64 Qt 5 7 1 5 3 3
  • impala与hive的比较以及impala的优缺点

    Impala相对于Hive所使用的优化技术 没有使用MapReduce进行并行计算 虽然MapReduce是非常好的并行计算框架 但它更多的面向批处理模式 而不是面向交互式的SQL执行 与MapReduce相比 Impala把整个查询分成一
  • 解决Idea按Alt+Enter键无效

    首先 去Settings gt keymap查看快捷键是否正确 默认情况是对的 关键来了 如果还不行 打开idea gt setting gt intention 有一个选项勾一下 搞定
  • Unity3d接入googleplay内购详细说明(四)

    因为本文内容比较多 整理花费时间比较长 故分几篇完成 以下为本文目录结构 方便查阅 Unity3d接入googleplay内购详细说明 一 引言 一 准备条件 二 谷歌开发者后台应用创建说明 Unity3d接入googleplay内购详细说
  • 会画画有什么用?

    盛夏的风 安江泽 小白菜 等 13332 人赞同 原问题是 会画画有什么用 现在这样一改感觉离题太远了 特此澄清 80后大叔在当年初中时家里不给买游戏机的时候可以自己画游戏棋和小伙伴玩 自己玩的比较久的是这个超任的超悟空传 游戏本来就是棋类
  • 出现了一个意外,不能完你在设置中所要求的更改-修改IPV4地址出错(更新)

    文章目录 一 更改IPV4的设置改不了 二 解决办法 1 通过管理员身份打开cmd窗口 2 输入两条指令 二 plus 解决方法后续 一 更改IPV4的设置改不了 本来我里面是有公司设置的IP地址和DNS服务器地址来着 现在要更改成自动获取
  • 解决PHP startup: Unable to load dynamic library的错误

    在 Windows 下安装完 PHP 和 web 服务器之后 可能想要安装一些扩展库来获得更多功能 可以通过修改 php ini 来选择当 PHP 启动时加载哪些扩展库 也可以在脚本中通过使用 dl 来动态加载 PHP 扩展库的 DLL 文
  • Qt各种采样率录音 录音到内存

    近段时间了解了Qt的录音模块 Qt的录音模块分为QAudioInput输入 QAudioOutput输出 输入用来录音 输出用于播放 当然还用其它的QMediaPlayer QAudioRecorder 这类控件封装的比较上层了 QAudi
  • JSONArray转换成List<T>

    常用的方法 1 首先有一个JSONArray对象 比如是jsonArray JSONObject jsonObject1 new JSONObject JSONObject1 put username zhangsan JSONObject
  • ROS 如何在同一节点node中实现订阅和发布?python

    文章目录 ROS 如何在同一个节点 node 中实现 订阅 和 发布 1 python 代码 2 启动其他节点之后 再运行这个节点 3 结果如下 4 有用请点赞 谢谢 1 点赞 积分 1 2 评论 积分 1 ROS 如何在同一个节点 nod
  • zookeeper(一)——— java.lang.ClassNotFoundException: org.slf4j.LoggerFactory 解决办法

    问题原因 这个问题是日志jar包造成的 一般来说缺少以下几个 解决办法 找一个未解压的安装包 windows版本的或者linux的都可以 只要不跨大版本 把lib包下的对应的jar包拿过来放在zookeeper的根目录就行 例如 我在lin
  • Python基础知识-字符串操作

    字符串常见操作 1 切片 2 查询 find index 3 大小写转换 upper lower swapcase capitalize和title 4 对齐 center just和zfill 5 分割 split splitlines和
  • NRF518522 DFU升级步骤

    1 安装 micro ecc 1 首先下载版本为 4 9 2015 q3 updata 的GCC编译器 2 安装 MinGW 将MinGW bin 安装目录加载到 系统环境变量中 安装MinGW msys组件 3 将下载好的micro ec
  • LeetCode05:最长回文数组

    题目 给定一个字符串 s 找到 s 中最长的回文子串 你可以假设 s 的最大长度为 1000 示例1 输入 babad 输出 bab 注意 aba 也是一个有效答案 示例2 输入 cbbd 输出 bb 详解 在完成算法的编程时 设计算法是至
  • PHP学习笔记——加密解密

    一 MD5算法 MD5消息摘要算法 Message Digest Algorithm 是R Rivest设计的 它对输入的任意长度的消息进行运算 产生一个128位的消息摘要 随着穷举攻击和密码分析的发展 MD5算法已经不再那么流行了 1 算