当前位置:首页 > 文章列表 > 文章 > php教程 > PHP常用加密函数有哪些?

PHP常用加密函数有哪些?

2025-10-30 20:48:28 0浏览 收藏

积累知识,胜过积蓄金银!毕竟在文章开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《PHP常用加密函数有哪些》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

PHP加密需根据场景选择:哈希函数如sha256用于数据校验,password_hash和password_verify专用于安全存密,openssl_encrypt/decrypt实现对称加密,非对称加密适用于密钥交换与签名;禁用MD5/SHA1存密因易受暴力与彩虹表攻击;密钥应通过环境变量或KMS安全存储,IV须随机唯一并随密文传输;此外,还需输入验证、防XSS/SQL注入、安全会话管理、CSRF防护及HTTPS等综合措施保障整体安全。

PHP加密函数有哪些_PHP常用加密解密函数与使用场景

PHP提供了多种加密解密手段,从单向的哈希函数用于数据完整性校验和密码存储,到双向的对称加密(如AES)用于敏感数据传输或存储,再到非对称加密(如RSA)用于安全通信和数字签名。选择哪种方式,关键在于理解它们各自的特点和适用场景,没有一劳永逸的“最佳”方案,只有最适合你当前需求的安全策略。

在PHP中,我们常用的加密解密函数大致可以分为几类:哈希函数(或称散列函数),主要用于不可逆的数据指纹生成;密码哈希函数,专为安全存储用户密码设计;以及对称加密和非对称加密函数,用于可逆的数据加解密。

哈希函数 (Hash Functions) 这类函数接收任意长度的输入,输出固定长度的哈希值。其核心特性是“单向性”,即很难从哈希值反推出原始数据。

  • md5(): 曾经非常流行,但现在已不被认为是安全的哈希算法,尤其不应用于密码存储。它主要用于文件完整性校验、生成短标识符等对安全性要求不高的场景。
  • sha1(): 比MD5略强,但同样存在安全隐患,不建议用于密码。在一些历史遗留系统或对安全性要求不高的场景(如Git的版本控制)还能见到。
  • hash(): 这是一个更通用的哈希函数,它允许你指定多种哈希算法,例如sha256sha512等。
    • 使用场景: 数据完整性校验(确保文件在传输过程中未被篡改)、生成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) 的管理: 密钥是加密和解密的核心。它必须是保密的,并且足够随机和复杂。

  1. 生成方式: 密钥应该通过密码学安全的随机数生成器生成,例如openssl_random_pseudo_bytes()。不要使用简单的字符串或者可预测的模式作为密钥。密钥长度要符合所选算法的要求,例如AES-256需要32字节(256位)的密钥。
  2. 存储位置: 这是最头疼的问题。密钥绝不能直接硬编码在代码中,也不应该存储在版本控制系统(如Git)中。理想的存储方式包括:
    • 环境变量: 这是比较常见且相对安全的做法。在服务器的环境变量中设置密钥,PHP代码通过getenv()$_ENV来获取。这样密钥就不会出现在代码文件里。
    • 安全配置文件: 将密钥存储在一个独立的配置文件中,并且确保这个文件不被Web服务器直接访问(例如放在Web根目录之外),同时设置严格的文件权限。
    • 硬件安全模块 (HSM) 或密钥管理服务 (KMS): 对于要求极高安全性的场景,可以考虑使用云服务商提供的KMS(如AWS KMS, Azure Key Vault)或物理HSM设备。这些服务专门用于安全地存储和管理密钥。
  3. 密钥轮换 (Key Rotation): 定期更换密钥是一种良好的安全实践。当密钥被长期使用时,它暴露在风险中的时间就越长。轮换密钥意味着你需要重新加密所有用旧密钥加密的数据,这通常需要仔细规划。

初始化向量 (IV) 的管理: IV与密钥不同,它不需要保密,但必须是随机的唯一的

  1. 生成方式: IV也必须通过密码学安全的随机数生成器生成,例如openssl_random_pseudo_bytes()。它的长度由所选的加密算法决定,可以通过openssl_cipher_iv_length($cipher)获取。
  2. 唯一性: 每次加密操作都必须使用一个新的、随机的IV。这是为了防止相同的明文在相同的密钥下产生相同的密文,从而避免“模式泄露”攻击。
  3. 存储和传输: 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应用中,除了前面提到的加密解密,我们还有很多其他的安全实践是不可或缺的。

  1. 输入验证与过滤 (Input Validation & Filtering): 这是防止大部分Web攻击的第一道防线。任何来自用户或外部系统的数据,在进入你的应用逻辑之前,都必须被视为“不信任”的。

    • SQL注入: 使用预处理语句(Prepared Statements),例如PDO或MySQLi的绑定参数功能。永远不要直接拼接用户输入到SQL查询中。
    • XSS (跨站脚本攻击): 对所有用户生成的内容进行严格的HTML实体编码或过滤,确保它们在显示时不会被浏览器解析为可执行的脚本。htmlspecialchars()是一个好用的函数,但更复杂的场景可能需要专门的库。
    • 文件上传漏洞: 严格检查上传文件的类型(MIME Type、文件头)、大小,并将其存储在Web根目录之外的安全位置,避免直接执行。
    • 命令注入: 如果应用需要执行系统命令,务必对输入进行严格过滤和转义,或者使用escapeshellarg()等函数。
  2. 输出转义 (Output Escaping): 和输入验证相辅相成,确保任何要显示给用户的数据都经过适当的转义,以防止XSS攻击。即使数据在存储时是干净的,如果输出时不转义,也可能被利用。例如,在HTML上下文中用htmlspecialchars(),在URL上下文中用urlencode()

  3. 会话管理安全 (Session Management Security): 用户会话是身份验证的关键。

    • 使用安全的Cookie: 设置HttpOnly(防止JavaScript访问Cookie)、Secure(只通过HTTPS传输)、SameSite=Lax/Strict(防止CSRF)属性。
    • 定期更新Session ID: 用户登录后重新生成Session ID,可以有效防止会话固定攻击。
    • 限制Session生命周期: 根据应用需求设置合理的会话过期时间。
    • 避免在URL中传递Session ID。
  4. CSRF (跨站请求伪造) 防护: 通过在敏感操作的表单中加入CSRF令牌(Token)来防止这类攻击。每次提交表单时,服务器会验证这个令牌是否有效。

  5. 错误处理与日志记录:

    • 不要泄露敏感信息: 生产环境中,错误信息不应该直接显示给用户,尤其是包含文件路径、数据库查询、API密钥等信息的错误。配置PHP的display_errors=Off
    • 详细的日志记录: 将错误和安全事件记录到日志文件中,便于审计和问题排查。
  6. 权限最小化原则 (Principle of Least Privilege):

    • 文件系统权限: Web服务器(如Nginx/Apache)运行的用户应该只有访问它需要的文件和目录的最小权限。配置文件、日志文件、上传目录等都应该有严格的权限设置。
    • 数据库用户权限: 数据库连接用户应该只拥有应用所需的最小权限,例如,一个Web应用通常只需要SELECT, INSERT, UPDATE, DELETE权限,而不需要DROP TABLEGRANT权限。
  7. HTTPS Everywhere: 部署SSL/TLS证书,强制所有流量都通过HTTPS传输。这可以防止中间人攻击,保护数据在传输过程中的机密性和完整性。

  8. 定期更新与安全审计:

    • PHP版本: 保持PHP版本更新到最新的稳定版本,因为新版本通常会修复已知的安全漏洞。
    • 框架和库: 使用Composer管理依赖,并定期更新所有第三方库,关注其安全公告。
    • 安全审计: 定期进行代码审计、渗透测试,发现潜在的安全漏洞。

这些实践就像是构建一道坚固的城墙,加密是其中一道关键的门,但如果没有其他城墙和防御工事,那道门也可能变得脆弱。安全是一个持续的过程,需要开发者时刻保持警惕和学习。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。

Java对象比较与排序技巧解析Java对象比较与排序技巧解析
上一篇
Java对象比较与排序技巧解析
《奶酪单词》邀请码使用方法详解
下一篇
《奶酪单词》邀请码使用方法详解
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ChatExcel酷表:告别Excel难题,北大团队AI助手助您轻松处理数据
    ChatExcel酷表
    ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
    3180次使用
  • Any绘本:开源免费AI绘本创作工具深度解析
    Any绘本
    探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
    3391次使用
  • 可赞AI:AI驱动办公可视化智能工具,一键高效生成文档图表脑图
    可赞AI
    可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
    3420次使用
  • 星月写作:AI网文创作神器,助力爆款小说速成
    星月写作
    星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
    4526次使用
  • MagicLight.ai:叙事驱动AI动画视频创作平台 | 高效生成专业级故事动画
    MagicLight
    MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
    3800次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码