我需要在php 5.2应用程序中对一些纯文本数据进行模糊处理或加密。
我更喜欢一种输入字符串和输出字符串保持相同长度的解决方案。
这不需要非常强大,因为还有许多其他安全层。强将是好的,但这将使程序员/ dba /支持人/等不会意外地从数据库中读取文本。
关键考虑因素
这是一个示例数据库表和数据:
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)列中。
答案 0 :(得分:17)
用于简单混淆使用strtr() - 翻译某些字符:
string strtr ( string $str , string $from , string $to )
在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 ([+,-!#$%&*])"
如果需要,您可以轻松地在数据库中复制此逻辑(无需循环):Using a Table of Numbers, by Erland Sommarskog
答案 1 :(得分:7)
base64 encoding怎么样?我们使用它来使我们的SMS Gateway DB中的SMS消息不被开发人员读取。
答案 2 :(得分:5)
有几个选择。
如果您想要非常强大,可以查看mcrypt.
但是,如果它只是这样工作的开发人员无法阅读文本,没有一些工作实际做到这一点。然后你可以BASE64 encode it或uuencode it
答案 3 :(得分: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相比),并且你不得不修复密钥。
干杯,
答案 4 :(得分:4)
尝试使用这些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
答案 5 :(得分:3)
如果你在版本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)
使用pass_str作为密码解密加密的字符串crypt_str。 crypt_str应该是从ENCODE()返回的字符串。
ENCODE(str,pass_str)
使用pass_str作为密码加密str。要解密结果,请使用DECODE()。
结果是一个与str。
长度相同的二进制字符串加密的强度取决于随机生成器的优异程度。它应该足够短字符串。
更新:另一种可能性是rot13
^^
答案 6 :(得分:2)
尝试使用mcrypt库。它不包含在标准PHP中,但它可以轻松下载并且非常常用。这是关于你可以用它做什么的a quick tutorial。
最好确保用于加密的密钥存储在安全的地方,但如果您并不真正关心安全性,那么您可能只需将密钥硬编码到您的代码中即可。