我有一个加密的JSON对象,它包含使用AES和RSA加密加密的数据列表。
<?php
function decrypt_data($encrypted_data, $session_key)
{
$decrypt = explode('|', $encrypted_data);
$decoded = base64_decode($decrypt[0]);
$iv = base64_decode($decrypt[1]);
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $session_key, $decoded, MCRYPT_MODE_CBC, $iv);
$decrypted = unserialize($decrypted);
return $decrypted;
}
function encrypt_session_key($session_key)
{
$sealed ="";
$ekeys="";
$pubKey[] = openssl_pkey_get_public("file:///public.pem");
$result = openssl_seal($session_key, $sealed, $ekeys, $pubKey);
$encrypted_session_key = array( 'encdata' => base64_encode($sealed), 'enckey' => base64_encode(serialize($ekeys)) );
return $encrypted_session_key;
}
$data = '{"index":{"12345":{"title":"title 1","date_modified":1029232323},"23456":{"title":"title 2","date_modified":1029232323}},"archived":{}}';
$session_key = openssl_random_pseudo_bytes(32);
$encrypted_data = encrypt_data($session_key, $data);
$encrypted_session_key = encrypt_session_key($session_key);
$session_key = null;
$encrypted_session_key_data = $encrypted_session_key['encdata'];
$encrypted_session_key_keys = $encrypted_session_key['enckey'];
// the encrypted data
$the_encrypted_data = array("data_key" => $encrypted_session_key_data, "encryption_data_key" => $encrypted_session_key_keys, "data" => $encrypted_data);
?>
每次用户加载其信息中心时,我都会使用dataTables解密数据并将其列在表格中。
<?php
function decrypt_session_key($encrypted_session, $env_key)
{
$private_key = openssl_get_privatekey("file:///private.pem", "password");
openssl_open(base64_decode($encrypted_session), $open, unserialize(base64_decode($env_key))[0], $private_key);
return $open;
}
function decrypt_data($encrypted_data, $session_key)
{
$decrypt = explode('|', $encrypted_data);
$decoded = base64_decode($decrypt[0]);
$iv = base64_decode($decrypt[1]);
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $session_key, $decoded, MCRYPT_MODE_CBC, $iv);
$decrypted = unserialize($decrypted);
return $decrypted;
}
$decrypted_key = decrypt_session_key($data_key, $encryption_data_key);
$the_decrypted_data = json_decode(decrypt_data($data, $decrypted_key), true);
?>
当列表中有大约10-100个项目时,列表加载需要8-10秒,我假设是因为解密数据需要一段时间。
有没有人对我的表单加起来如何使整个过程更快一些有任何建议?一旦我在此列表中拥有1000或甚至10,000个数据,我不希望它花费很长时间。
唯一的规定是,数据必须加密。
答案 0 :(得分:1)
大部分时间都可能是会话密钥的RSA解密。 RSA比AES慢得多。可能最好的做法是为多个字段创建会话单个密钥并解密一次。目前它们都依赖于相同的私钥,因此在密钥管理方面并不重要。您已经为每个字段提供随机IV,因此加密本身应该是安全的。
您可以做的另一个小改动是实际使用AES。 MCRYPT_RIJNDAEL_256
是Rijndael,块大小为256位而不是128位。块大小为128位(MCRYPT_RIJNDAEL_1282
)的Rijndael等于AES - 目前您无法使用仅AES库进行解密。密钥大小取决于会话密钥的大小。
另一种解决方法是切换到Elliptic Curve EC密钥对并使用ECIES。解密速度要快得多(加密速度稍慢)。如果你还不知道Elliptic Curve密码术,这将需要一个陡峭的学习曲线。
最后,与mcrypt相比,OpenSSL在英特尔平台上会更快,而mcrypt不支持AES-NI指令集(目前据我所知 - C-lib多年来一直没有更新)。但是,PHP OpenSSL API非常有限,目前我无法在这里提供帮助。
答案 1 :(得分:0)
也许您可以使用多个ajax请求来模拟多线程解密。