PHP常用加密函数有哪些?
积累知识,胜过积蓄金银!毕竟在文章开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《PHP常用加密函数有哪些》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~
PHP加密需根据场景选择:哈希函数如sha256用于数据校验,password_hash和password_verify专用于安全存密,openssl_encrypt/decrypt实现对称加密,非对称加密适用于密钥交换与签名;禁用MD5/SHA1存密因易受暴力与彩虹表攻击;密钥应通过环境变量或KMS安全存储,IV须随机唯一并随密文传输;此外,还需输入验证、防XSS/SQL注入、安全会话管理、CSRF防护及HTTPS等综合措施保障整体安全。

PHP提供了多种加密解密手段,从单向的哈希函数用于数据完整性校验和密码存储,到双向的对称加密(如AES)用于敏感数据传输或存储,再到非对称加密(如RSA)用于安全通信和数字签名。选择哪种方式,关键在于理解它们各自的特点和适用场景,没有一劳永逸的“最佳”方案,只有最适合你当前需求的安全策略。
在PHP中,我们常用的加密解密函数大致可以分为几类:哈希函数(或称散列函数),主要用于不可逆的数据指纹生成;密码哈希函数,专为安全存储用户密码设计;以及对称加密和非对称加密函数,用于可逆的数据加解密。
哈希函数 (Hash Functions) 这类函数接收任意长度的输入,输出固定长度的哈希值。其核心特性是“单向性”,即很难从哈希值反推出原始数据。
md5(): 曾经非常流行,但现在已不被认为是安全的哈希算法,尤其不应用于密码存储。它主要用于文件完整性校验、生成短标识符等对安全性要求不高的场景。sha1(): 比MD5略强,但同样存在安全隐患,不建议用于密码。在一些历史遗留系统或对安全性要求不高的场景(如Git的版本控制)还能见到。hash(): 这是一个更通用的哈希函数,它允许你指定多种哈希算法,例如sha256、sha512等。- 使用场景: 数据完整性校验(确保文件在传输过程中未被篡改)、生成API签名、缓存键等。
- 示例:
hash('sha256', $data)
密码哈希函数 (Password Hashing Functions) 这是PHP专门为安全存储用户密码而设计的函数集。它们引入了“盐值”(salt)和“迭代次数”(iterations)的概念,能有效抵御彩虹表攻击和暴力破解。
password_hash(): 这是存储用户密码的黄金标准。它会自动生成一个随机盐值,并使用一个安全的、自适应的哈希算法(如bcrypt或argon2i/argon2id,取决于PHP版本和配置)进行多轮迭代。- 使用场景: 存储用户注册密码。
- 示例:
password_hash($password, PASSWORD_DEFAULT)
password_verify(): 用于验证用户输入的密码是否与存储的哈希值匹配。- 使用场景: 用户登录验证。
- 示例:
password_verify($inputPassword, $storedHash)
对称加密函数 (Symmetric Encryption Functions) 这类函数使用同一个密钥进行加密和解密。由于速度快,常用于大量数据的加密。
openssl_encrypt()和openssl_decrypt(): 这是PHP中最推荐的对称加密函数,基于OpenSSL库,支持多种算法(如AES-256-CBC)和模式。它需要一个密钥(key)和一个初始化向量(IV)。使用场景: 存储敏感的用户数据(如银行卡号、身份证信息),加密API请求体,保护传输中的数据。
示例:
$plaintext = "这是我的敏感数据。"; $cipher = "aes-256-cbc"; // 算法 $key = openssl_random_pseudo_bytes(32); // 256位密钥 $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($cipher)); // 随机IV $encrypted = openssl_encrypt($plaintext, $cipher, $key, 0, $iv); $decrypted = openssl_decrypt($encrypted, $cipher, $key, 0, $iv); // 注意:实际应用中,你需要安全地存储和传输$key和$iv(或者只传输IV)
非对称加密函数 (Asymmetric Encryption Functions) 非对称加密使用一对密钥:公钥和私钥。公钥可以公开,私钥必须严格保密。公钥加密的数据只能用对应的私钥解密,反之亦然。
- OpenSSL扩展中的一系列函数,如
openssl_public_encrypt()、openssl_private_decrypt()、openssl_sign()、openssl_verify()等。- 使用场景: 安全地交换对称密钥、数字签名(验证数据来源和完整性)、小段敏感数据的安全传输。
- 复杂性: 相较于对称加密,非对称加密通常速度较慢,更适合小数据量或密钥交换。
为什么不应该再用MD5或SHA1加密用户密码?
说实话,每次看到项目还在用MD5或者SHA1来存储用户密码,我心里都会咯噔一下。这真的不是在开玩笑,这两种算法在密码存储场景下,早就被证明是不安全的了。
首先,MD5和SHA1都是哈希函数,它们的设计初衷是生成数据的“指纹”,用于校验数据完整性,而不是为了抵抗恶意攻击而设计的。它们计算速度非常快,这在以前被认为是优点,但在今天,对于密码哈希来说,这恰恰是致命的缺点。攻击者可以利用高性能的CPU或GPU,在极短的时间内尝试数百万甚至数十亿个密码组合,这种攻击方式叫做“暴力破解”。
其次,MD5和SHA1都存在“彩虹表攻击”的风险。彩虹表是一种预先计算好的哈希值数据库,里面存储了大量常用密码及其对应的哈希值。如果你的用户密码哈希值正好在彩虹表里,攻击者根本不需要破解,直接查表就能得到原始密码。更糟糕的是,它们不具备“盐值”(Salt)的概念或者说没有强制使用随机盐。盐值是一个随机字符串,在哈希密码时会和原始密码混合在一起。有了盐值,即使两个用户设置了相同的密码,它们的哈希值也会完全不同,这大大增加了彩虹表攻击的难度。
最后,MD5已经发现了“碰撞攻击”的漏洞,这意味着可以找到两个不同的输入,却生成相同的MD5哈希值。虽然这在密码破解中不一定直接等同于能找到原始密码,但它从根本上动摇了MD5作为安全哈希算法的基石。SHA1虽然尚未发现实际可用的通用碰撞攻击,但理论上其安全性也大不如前。
所以,为了用户的账户安全,我们现在都应该使用password_hash()和password_verify()这对组合。它们内置了安全的哈希算法(如Bcrypt或Argon2),会自动生成随机盐值,并且算法本身设计得比较慢,能够有效抵御暴力破解和彩虹表攻击。这是PHP官方推荐的,也是业界公认的最佳实践。
PHP中实现对称加密,openssl_encrypt的密钥和IV该如何管理?
在使用openssl_encrypt进行对称加密时,密钥(Key)和初始化向量(IV)的管理,在我看来,是整个加密链条中至关重要的一环,甚至可以说,密钥和IV的安全管理决定了你数据加密的实际安全性。加密算法本身再强大,密钥和IV一旦泄露,数据也就形同裸奔。
密钥 (Key) 的管理: 密钥是加密和解密的核心。它必须是保密的,并且足够随机和复杂。
- 生成方式: 密钥应该通过密码学安全的随机数生成器生成,例如
openssl_random_pseudo_bytes()。不要使用简单的字符串或者可预测的模式作为密钥。密钥长度要符合所选算法的要求,例如AES-256需要32字节(256位)的密钥。 - 存储位置: 这是最头疼的问题。密钥绝不能直接硬编码在代码中,也不应该存储在版本控制系统(如Git)中。理想的存储方式包括:
- 环境变量: 这是比较常见且相对安全的做法。在服务器的环境变量中设置密钥,PHP代码通过
getenv()或$_ENV来获取。这样密钥就不会出现在代码文件里。 - 安全配置文件: 将密钥存储在一个独立的配置文件中,并且确保这个文件不被Web服务器直接访问(例如放在Web根目录之外),同时设置严格的文件权限。
- 硬件安全模块 (HSM) 或密钥管理服务 (KMS): 对于要求极高安全性的场景,可以考虑使用云服务商提供的KMS(如AWS KMS, Azure Key Vault)或物理HSM设备。这些服务专门用于安全地存储和管理密钥。
- 环境变量: 这是比较常见且相对安全的做法。在服务器的环境变量中设置密钥,PHP代码通过
- 密钥轮换 (Key Rotation): 定期更换密钥是一种良好的安全实践。当密钥被长期使用时,它暴露在风险中的时间就越长。轮换密钥意味着你需要重新加密所有用旧密钥加密的数据,这通常需要仔细规划。
初始化向量 (IV) 的管理: IV与密钥不同,它不需要保密,但必须是随机的和唯一的。
- 生成方式: IV也必须通过密码学安全的随机数生成器生成,例如
openssl_random_pseudo_bytes()。它的长度由所选的加密算法决定,可以通过openssl_cipher_iv_length($cipher)获取。 - 唯一性: 每次加密操作都必须使用一个新的、随机的IV。这是为了防止相同的明文在相同的密钥下产生相同的密文,从而避免“模式泄露”攻击。
- 存储和传输: IV可以与密文一起存储或传输,因为它的作用是扰乱加密过程,而不是提供保密性。通常的做法是将IV作为密文的一部分,或者在密文前面加上IV,或者将其编码(如base64)后与密文拼接在一起。解密时,先分离出IV,再用它进行解密。
一个简单的IV处理示例:
$plaintext = "这是我的敏感数据。";
$cipher = "aes-256-cbc";
$key = getenv('MY_ENCRYPTION_KEY'); // 从环境变量获取密钥
if (!$key) {
die("加密密钥未设置!"); // 实际应用中应有更完善的错误处理
}
$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes($ivlen); // 生成随机IV
$encrypted = openssl_encrypt($plaintext, $cipher, $key, 0, $iv);
// 将IV和密文拼接在一起存储或传输,这里使用base64编码
$encoded_data = base64_encode($iv . $encrypted);
// 解密时
$decoded_data = base64_decode($encoded_data);
$retrieved_iv = substr($decoded_data, 0, $ivlen);
$retrieved_encrypted = substr($decoded_data, $ivlen);
$decrypted = openssl_decrypt($retrieved_encrypted, $cipher, $key, 0, $retrieved_iv);
echo "原始数据: " . $plaintext . "\n";
echo "加密后数据: " . $encoded_data . "\n";
echo "解密后数据: " . $decrypted . "\n";总之,密钥的安全是第一位的,而IV的随机性和唯一性则是确保加密强度的关键。两者缺一不可。
除了加密,PHP在数据安全方面还有哪些常用实践?
数据安全可不是只有加密那么简单,加密只是防御体系中的一环。作为一个真实项目的开发者,我深知,真正的安全是一个系统工程,需要从多个维度去构建和维护。在PHP应用中,除了前面提到的加密解密,我们还有很多其他的安全实践是不可或缺的。
输入验证与过滤 (Input Validation & Filtering): 这是防止大部分Web攻击的第一道防线。任何来自用户或外部系统的数据,在进入你的应用逻辑之前,都必须被视为“不信任”的。
- SQL注入: 使用预处理语句(Prepared Statements),例如PDO或MySQLi的绑定参数功能。永远不要直接拼接用户输入到SQL查询中。
- XSS (跨站脚本攻击): 对所有用户生成的内容进行严格的HTML实体编码或过滤,确保它们在显示时不会被浏览器解析为可执行的脚本。
htmlspecialchars()是一个好用的函数,但更复杂的场景可能需要专门的库。 - 文件上传漏洞: 严格检查上传文件的类型(MIME Type、文件头)、大小,并将其存储在Web根目录之外的安全位置,避免直接执行。
- 命令注入: 如果应用需要执行系统命令,务必对输入进行严格过滤和转义,或者使用
escapeshellarg()等函数。
输出转义 (Output Escaping): 和输入验证相辅相成,确保任何要显示给用户的数据都经过适当的转义,以防止XSS攻击。即使数据在存储时是干净的,如果输出时不转义,也可能被利用。例如,在HTML上下文中用
htmlspecialchars(),在URL上下文中用urlencode()。会话管理安全 (Session Management Security): 用户会话是身份验证的关键。
- 使用安全的Cookie: 设置
HttpOnly(防止JavaScript访问Cookie)、Secure(只通过HTTPS传输)、SameSite=Lax/Strict(防止CSRF)属性。 - 定期更新Session ID: 用户登录后重新生成Session ID,可以有效防止会话固定攻击。
- 限制Session生命周期: 根据应用需求设置合理的会话过期时间。
- 避免在URL中传递Session ID。
- 使用安全的Cookie: 设置
CSRF (跨站请求伪造) 防护: 通过在敏感操作的表单中加入CSRF令牌(Token)来防止这类攻击。每次提交表单时,服务器会验证这个令牌是否有效。
错误处理与日志记录:
- 不要泄露敏感信息: 生产环境中,错误信息不应该直接显示给用户,尤其是包含文件路径、数据库查询、API密钥等信息的错误。配置PHP的
display_errors=Off。 - 详细的日志记录: 将错误和安全事件记录到日志文件中,便于审计和问题排查。
- 不要泄露敏感信息: 生产环境中,错误信息不应该直接显示给用户,尤其是包含文件路径、数据库查询、API密钥等信息的错误。配置PHP的
权限最小化原则 (Principle of Least Privilege):
- 文件系统权限: Web服务器(如Nginx/Apache)运行的用户应该只有访问它需要的文件和目录的最小权限。配置文件、日志文件、上传目录等都应该有严格的权限设置。
- 数据库用户权限: 数据库连接用户应该只拥有应用所需的最小权限,例如,一个Web应用通常只需要
SELECT,INSERT,UPDATE,DELETE权限,而不需要DROP TABLE或GRANT权限。
HTTPS Everywhere: 部署SSL/TLS证书,强制所有流量都通过HTTPS传输。这可以防止中间人攻击,保护数据在传输过程中的机密性和完整性。
定期更新与安全审计:
- PHP版本: 保持PHP版本更新到最新的稳定版本,因为新版本通常会修复已知的安全漏洞。
- 框架和库: 使用Composer管理依赖,并定期更新所有第三方库,关注其安全公告。
- 安全审计: 定期进行代码审计、渗透测试,发现潜在的安全漏洞。
这些实践就像是构建一道坚固的城墙,加密是其中一道关键的门,但如果没有其他城墙和防御工事,那道门也可能变得脆弱。安全是一个持续的过程,需要开发者时刻保持警惕和学习。
以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。
Java对象比较与排序技巧解析
- 上一篇
- Java对象比较与排序技巧解析
- 下一篇
- 《奶酪单词》邀请码使用方法详解
-
- 文章 · php教程 | 1小时前 |
- Laravel测验评分for循环索引问题解决
- 251浏览 收藏
-
- 文章 · php教程 | 1小时前 |
- LaravelDusk剪贴板权限设置教程
- 186浏览 收藏
-
- 文章 · php教程 | 1小时前 |
- PHP多维数组条件赋值方法解析
- 448浏览 收藏
-
- 文章 · php教程 | 1小时前 |
- Laravel路由控制器工作原理解析
- 488浏览 收藏
-
- 文章 · php教程 | 2小时前 |
- XAMPP端口冲突解决全攻略
- 129浏览 收藏
-
- 文章 · php教程 | 2小时前 |
- PHP信号量与共享内存使用教程
- 323浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3180次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3391次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3420次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4526次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3800次使用
-
- PHP技术的高薪回报与发展前景
- 2023-10-08 501浏览
-
- 基于 PHP 的商场优惠券系统开发中的常见问题解决方案
- 2023-10-05 501浏览
-
- 如何使用PHP开发简单的在线支付功能
- 2023-09-27 501浏览
-
- PHP消息队列开发指南:实现分布式缓存刷新器
- 2023-09-30 501浏览
-
- 如何在PHP微服务中实现分布式任务分配和调度
- 2023-10-04 501浏览

