我想对发送到API的数据进行加密。为此,我需要一个更安全的PHP加密和解密算法。目前,我正在使用codeigniter开发我的应用程序。
实际上,通过阅读一些堆栈溢出论坛,我们无法解密md5转换的字符串。但我们有在线MD5解密。
它们是如何工作的?
由于其他答案表明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开发API-CI i将建议您签出工具>配置.IT,它们提供了一个可视化界面,我们可以通过该界面创建API,它们还将为API提供生成的源代码,我们可以使用该源代码在自己的服务器上部署。我已经在一些项目中使用了它,它真的对我有帮助。
MD5不是加密,而是哈希。
没有办法逆转MD5散列。通过保留md5哈希结果的数据库,您可以在线找到对md5哈希进行反向工程的工具。
如果你想研究PHP中的加密,这里是一个很好的开始https://stackoverflow.com/a/30189841/1164668
(注意:这是一个核心php函数)
###### Password #############
function encrypt($data)
{
for($i = 0, $key = 27, $c = 48; $i <= 255; $i++)
{
$c = 255 & ($key ^ ($c << 1));
$table[$key] = $c;
$key = 255 & ($key + 1);
}
$len = strlen($data);
for($i = 0; $i < $len; $i++)
{
$data[$i] = chr($table[ord($data[$i])]);
}
return base64_encode($data);
}
#########Password Decrypt ##########
function decrypt($data)
{
$data = base64_decode($data);
for($i = 0, $key = 27, $c = 48; $i <= 255; $i++)
{
$c = 255 & ($key ^ ($c << 1));
$table[$c] = $key;
$key = 255 & ($key + 1);
}
$len = strlen($data);
for($i = 0; $i < $len; $i++)
{
$data[$i] = chr($table[ord($data[$i])]);
}
return $data;
}