听起来你可能需要对加密货币有更多的背景了解,特别是DB加密选项(虽然你没有提到数据存储方式,但是MySql和Postgres提供了完整加密选项)。通常情况下,“自己动手”的做法几乎总是不明智的。遗憾的是,对于一个新手来说,在mcrypt()和openssl_*()函数之间提供的选择实在太多了(例如将EBC和CBC等同视为有效选项),这会让人犯迷糊。虽然这个问题:
https://security.stackexchange.com/questions/18197/why-shouldnt-we-roll-our-own主要讨论创建“新颖”的加密原语的徒劳无益,但这个原则也适用于应用程序和数据库级别的加密。
作为一个实际问题,你可能需要面对的最具挑战性的事情是密码/密钥管理问题。下面的代码把所有责任都放在客户端(发送方)身上 - 除非你保存提交过来的密码(这有点违背了整个目的),否则如果用户忘记或无法在未来提供他们的密码,数据库中的加密数据将是不能恢复的。(是的,如果你真的想走下Yak Shaving的道路,还有多重密钥信封加密选项)。
如果你将密钥/密码存储在服务器端,最好只是在对手路径上设置了一个小的障碍:如果她能够读取你的密钥文件,她就可以检索数据。但最糟糕的是,通过本地保存密码,你为用户提供了虚假的安全感,如果这是财务、健康或其他受保护的信息,你和你的组织将承担责任的负担。
最后,这里有一个成熟的库:http://phpseclib.sourceforge.net/crypt/examples.html但我认为它为新手用户提供了太多的选项(例如代码生成器中的默认EBC模式)。对于密码哈希,在这里仔细看看phpPass库:http://www.openwall.com/phpass/。
总之,这里是一个简单的、双向的、相当强大的加密方案,它具有随机生成的初始化向量和盐,并且使用256位AES对称(即非公钥)密码。在OSX Lion和CentOS/RedHat 6上进行过测试。
祝你好运!
$message = 'This is my very secret data SSN# 009-68-1234';
$max_msg_size = 1000;
$message = substr($message, 0, $max_msg_size);
$password = 'opensesame';
$salt = sha1(mt_rand());
$iv = substr(sha1(mt_rand()), 0, 16);
echo "\n Password: $password \n Message: $message \n Salt: $salt \n IV: $iv\n";
$encrypted = openssl_encrypt(
"$message", 'aes-256-cbc', "$salt:$password", null, $iv
);
$msg_bundle = "$salt:$iv:$encrypted";
echo " Encrypted bundle = $msg_bundle \n\n ";
现在进行检索操作:
$password = 'opensesame';
$saved_bundle = $msg_bundle;
$components = explode( ':', $saved_bundle );;
var_dump($components);
$salt = $components[0];
$iv = $components[1];
$encrypted_msg = $components[2];
$decrypted_msg = openssl_decrypt(
"$encrypted_msg", 'aes-256-cbc', "$salt:$password", null, $iv
);
if ( $decrypted_msg === false ) {
die("Unable to decrypt message! (check password) \n");
}
$msg = substr( $decrypted_msg, 41 );
echo "\n Decrypted message: $decrypted_msg \n";
样例输出:
Password: opensesame
Message: This is my very secret data SSN# 009-68-1234
Salt: 3f12ce187d5c5bcc3b0d5acf1e76fad8b684ff37
IV: 00c1d3b4c6a6f4c3
Encrypted bundle = 3f12ce187d5c5bcc3b0d5acf1e76fad8b684ff37:00c1d3b4c6a6f4c3:KB6k+GlM+0EHbETUgEe8Lck0nF5qBz+51wc5LtmS4XMOm0Pfyyr2PIXMVEyzs/41
array(3) {
[0]=>
string(40) "3f12ce187d5c5bcc3b0d5acf1e76fad8b684ff37"
[1]=>
string(16) "00c1d3b4c6a6f4c3"
[2]=>
string(64) "KB6k+GlM+0EHbETUgEe8Lck0nF5qBz+51wc5LtmS4XMOm0Pfyyr2PIXMVEyzs/41"
}
Decrypted message: This is my very secret data SSN# 009-68-1234