我需要混淆或在我的PHP 5.2的应用程序加密一些纯文本数据。
我宁愿这将对输入字符串输出字符串保留相同长度的解决方案。
这并不需要非常强的,因为有到位的安全的许多其他层。 强大的将是一件好事,但是这将只是保持程序员/ DBA /技术支持人员的/ etc意外地从数据库中读取文本。
关键因素
- 编辑ADD我宁愿将有输入字符串输出字符串保留相同长度的解决方案。
- 只有字符串文本将被混淆/在数据库加密存储
- PHP应用程序都需要进行模糊处理/加密数据之前,数据库保存,并需要取消模糊处理/ dencrypt以下数据库中读取
- 这是对现有应用程序的修改
- 只有一些列需要进行模糊处理/加密
- 只有一些行需要根据类型字段被扰乱/加密,
- 只有少数加载/保存点处理
- 最大列尺寸已经确定了一些领域,但不是为别人,但我更喜欢一个解决受限领域的现有大小内工作
- 编辑,添加的关键将是可能是一些主键信息+不可编辑的字段的复合
这里是一个示例数据库表和数据:
int char(1) varchar(24) int date
MyPrimaryKey RowType UserText UserNo DateChange
------------ ------- ------------------------ -------- ----------------
1 N nothing special here 43 6/20/2009 12:11am
2 N same thing, wow! 78 6/23/2009 1:03pm
3 S fBJKg}.jkjWfF78dlg@45kjg 43 6/25/2009 6:45am
4 N same old, same old text 21 6/25/2009 8:11am
该应用程序将加载和显示行1,2和4通常。 然而这将有条件地(基于行类型)处理使用这种模糊处理/加密和未模糊处理在第3行的文字/解密逻辑。
任何人都可以提供模糊处理/加密和未模糊处理/解密功能的代码,链接,或指针,这将有助于在这里?
谢谢!
编辑
我喜欢编码的想法简单的base64,但有,可以保持一个固定大小中的数据的方法。 列出的所有方法,至今有超过输入值时的输出值。 这将是对于某些列,其中用户可以在50个字符输入一个问题,它被存储在一个varchar(50)柱上。
Answer 1:
对于简单的混淆使用strtr函数的效率() - 翻译某些字符:
弦strtr函数的效率 (字符串$海峡,从字符串$,$弦向)
在PHP编码:
$readable='This is a special test string ABC123 ([+,-!#$%&*])';
$unreadable=strtr($readable,' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
,'¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ '
);
print $unreadable; //outputs: "ÕéêôAêôAâAôñæäêâíAõæôõAôõóêïèAÂÃIJ³´A©Ü¬®¢¤¥¦§«Þª"
在PHP解码:
$unreadable='ÕéêôAêôAâAôñæäêâíAõæôõAôõóêïèAÂÃIJ³´A©Ü¬®¢¤¥¦§«Þª';
$readable=strtr($unreadable,'¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ '
,' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
);
print $readable; //outputs: "This is a special test string ABC123 ([+,-!#$%&*])"
可以很容易地在必要时(不循环)复制此逻辑在DB: 使用数字的表,通过厄兰Sommarskog
Answer 2:
如何base64编码 ? 我们用用它来使我们的短信网关DB短信不可读由开发商。
Answer 3:
有几个选项。
如果你想很强大,你可以看看mcrypt的。
但是,如果它只有这么工作的开发人员不能没有一些工作,阅读文本,以真正做到这一点。 然后,你可以只Base64编码,它或对其进行uuencode
Answer 4:
如果你已经安装的mcrypt(我当前所有的PHP环境都有),你可以使用mcrypt_encrypt和mcrypt_decrypt是这样的:
function encrypt ($text) {
global $key;
return mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, "abcdefghijklmnopqrstuvwxyz012345");
}
function decrypt ($secret) {
global $key;
return rtrim (mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $key, $secret, MCRYPT_MODE_ECB, "abcdefghijklmnopqrstuvwxyz012345"), "\0");
}
它采用了全球$key
和AES(非常强)。
缺点是性能(相比于类似的Base64简单的),并且你总得要解决的关键。
干杯,
Answer 5:
试试这些PHP函数convert_uuencode和convert_uudecode :
function encrypt_decrypt ($data, $encrypt) {
if ($encrypt == true) {
$output = base64_encode (convert_uuencode ($data));
} else {
$output = convert_uudecode (base64_decode ($data));
}
return $output;
}
$enc_txt = encrypt_decrypt ("HELLO DATA", true);
echo $enc_txt."\n"; // KjIkNSwzJFxAMSQlNDAwYGAKYAo=
echo encrypt_decrypt ($enc_txt, false); // HELLO DATA
Answer 6:
如果你使用大约5 MySQL版本,那么你甚至不需要太多的PHP它,你可以做到这一点与MySQL字符串函数查询内部encrypt(text, password)
和decrypt(text, password)
http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html
DECODE(crypt_str,pass_str)
解密的crypt_str使用pass_str作为密码加密的字符串。 的crypt_str应该从ENCODE返回的字符串()。
ENCODE(str,pass_str)
str加密使用pass_str作为密码。 要解密结果,使用DECODE()。
结果是相同的长度STR的二进制字符串。
加密的强度是根据随机数发生器有多好。 它应该足够短字符串。
更新:另一种可能性是rot13
^^
Answer 7:
尝试使用的mcrypt库。 它不包含在标准的PHP,但它很容易下载和很常用。 这里有一个快速教程,你可以用它做什么。
这是最好的,以确保您使用的加密密钥存储在一个安全的地方,但如果你是不是真的担心安全,你可能是OK只是硬编码的钥匙插入你的代码的某个地方。
文章来源: obfuscate or encrypt some plain text data in PHP