php - PHP中的加解密算法

标签 php algorithm codeigniter encryption cryptography

<分区>

我想加密发送到 API 的数据。为此,我需要一个更安全的 PHP 加密和解密算法。目前我正在使用 codeigniter 开发我的应用程序。

其实通过看一些stack overflow论坛,我们是无法解密md5转换后的字符串的。但是我们有在线MD5解密。

How do they work?

最佳答案

正如其他答案所暗示的那样,MD5 不是加密方法,因为您需要使用一些加密算法。

我会说你应该使用业界最好的 AES 加密,你将获得每种语言的支持类,即 OBJC/PHP/JAVA/.NET/NODE.JS 等。

因为你在 CodeIgnitor 工作,我有一个你可以直接使用的库,我希望它能解决你的问题。

这是库代码,只是为了更新它使用 php 的 MCRYPT 扩展,它通常在大多数服务器中启用。 图书馆类

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
Class Api_encrypt
{

    protected $CI;
    private $_encryptKey;
    private $_MD5Key;
    private $_MD5IV;
    private $_apiParams;

    public function __construct()
    {
        $this->CI = & get_instance();
        $this->_encryptKey = $this->CI->config->item("WS_ENC_KEY");
        $this->_MD5Key = substr(md5($this->_encryptKey), 0, 16);
        $this->_MD5IV = str_repeat("\0", mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));
    }

    public function encrypt($sValue = '')
    {
        $block = 16;
        $pad = $block - (strlen($sValue) % $block);
        $sValue .= str_repeat(chr($pad), $pad);
        $str_output = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->_MD5Key, $sValue, MCRYPT_MODE_CBC, $this->_MD5IV));
        $str_output = str_replace(array('+', '/', '='), array('-', '_', '.'), $str_output);
        return $str_output;
    }

    public function decrypt($sValue = '')
    {
        //$sValue = str_replace('~','+',$sValue);
        $sValue = str_replace(array('-', '_', '.'), array('+', '/', '='), $sValue);
        $sValue = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->_MD5Key, base64_decode($sValue), MCRYPT_MODE_CBC, $this->_MD5IV);
        $block = 16;
        $pad = ord($sValue[($len = strlen($sValue)) - 1]);
        $len = strlen($sValue);
        $pad = ord($sValue[$len - 1]);
        $str_output = substr($sValue, 0, strlen($sValue) - $pad);
        return $str_output;
    }

    public function encryptData($sValue = '')
    {
        $block = 16;
        $pad = $block - (strlen($sValue) % $block);
        $sValue .= str_repeat(chr($pad), $pad);
        $str_output = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->_MD5Key, $sValue, MCRYPT_MODE_CBC, $this->_MD5IV));
        return $str_output;
    }

    public function decryptData($sValue = '')
    {
        $str_output = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->_MD5Key, base64_decode($sValue), MCRYPT_MODE_CBC, $this->_MD5IV);
        $block = 16;
        $pad = ord($str_output[($len = strlen($str_output)) - 1]);
        $len = strlen($str_output);
        $pad = ord($str_output[$len - 1]);
        $str_output = substr($str_output, 0, strlen($str_output) - $pad);
        return $str_output;
    }

    public function decrypt_params($request_arr = array())
    {
        if (!is_array($request_arr) || count($request_arr) == 0) {
            return $request_arr;
        }
        foreach ($request_arr as $key => $val) {
            $param_val = str_replace(' ', '+', $val);
            $request_arr[$key] = $this->decryptData($param_val);
        }
        return $request_arr;
    }
}

这里是关于如何使用这个库的代码。

//In Controller
$request_params = $this->input->get_post(NULL, TRUE);
$this->load->library('api_encrypt');
$decrypt_params = $this->api_encrypt->decrypt_params($request_params);

//do operations
//prepare response array

$encrypt_str = $this->api_encrypt->encrypt($response);

既然您说您正在使用 PHP - CI 开发 API,我建议您检查该工具 > Configure.IT ,他们提供了一个可视化界面,我们可以通过它创建 API,他们还将为 API 提供生成的源代码,我们可以使用这些源代码部署在我们自己的服务器上。我已经将它用于一些项目,它确实帮助了我。

关于php - PHP中的加解密算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34308671/

相关文章:

php - 如何在没有数据库的情况下显示当前在线用户?或者至少非常有效。最好用 PHP

ruby - 基于步进的信号平滑信号 - 如何插值?

Codeigniter 不创建任何日志文件

php - 如何在 CodeIgniter 中仅从日期时间获取日期?

php - Laravel artisan : Using a remote database

php - 正则表达式匹配单词组和先前匹配的单词组的部分

algorithm - 查找在 BGL 图中的路径中使用了哪条平行边?

php - 如何使用 twitter API 发布多张图片?

php - 我的自动重定向登录页面方法在 PHP 中是否正确?

Java:根据多个规则替换字符串