我有一个与Laravel集成的遗留数据库。
数据库中的某些varbinary字段使用AES_ENCRYPT存储在旧版应用程序的原始查询中。在Laravel的Eloquent模型中,我想编写一个访问器,在需要时解密这些数据,而不必对数据库进行额外的查询。我该怎么做呢?
旧应用程序正在加密数据,如下所示: AES_DECRYPT(first_name,?)在哪里?指的是以sha1('mykeyhere')传入的密钥。
有什么想法吗?
答案 0 :(得分:3)
没有人应该做过导致这种情况的任何事情,但是这里是如何使用未弃用的API解码它。
/**
* @param string $crypted Un-encoded input
* @param string $key Key string provided to mysql AES_ENCRYPT();
* @return string
**/
function mysql_aes_decrypt($crypted, $key) {
// mysql will happily fudge your key for you, so we do too
$keylen = strlen($key);
if( $keylen < 16 ) {
$key = str_pad($key, 16, "\0");
} else if( $keylen > 16 ) {
$key = substr($key, 0, 16);
}
return openssl_decrypt($crypted, 'AES-128-ECB', $key, OPENSSL_RAW_DATA);
}
$plain = 'foo';
$key = 'bar';
// SELECT AES_ENCRYPT('foo', 'bar')
$crypted = hex2bin('93F254924801B8B0F000571DFD8C4A5E');
var_dump( mysql_aes_decrypt($crypted, $key) ); // string(3) "foo"