在PHP中混淆或加密一些纯文本数据

时间:2009-06-25 12:25:20

标签: php encryption encoding obfuscation

我需要在php 5.2应用程序中对一些纯文本数据进行模糊处理或加密。

我更喜欢一种输入字符串和输出字符串保持相同长度的解决方案。

这不需要非常强大,因为还有许多其他安全层。强将是好的,但这将使程序员/ dba /支持人/等不会意外地从数据库中读取文本。

关键考虑因素

  • 编辑添加我更喜欢一种输入字符串和输出字符串保持相同长度的解决方案。
  • 仅对字符串文本进行模糊/加密以存储在数据库中
  • php应用程序需要在数据库保存之前对数据进行模糊/加密,并且需要在数据库读取后取消模糊/解密
  • 这是对现有应用程序的修改
  • 只需要对某些列进行模糊处理/加密
  • 根据Type字段
  • ,只需要对某些行进行模糊/加密
  • 只需处理几个加载/保存点
  • 某些字段的最大列大小已经确定,但其他字段没有确定,但我更倾向于在受限字段的现有大小范围内使用解决方案
  • 编辑,添加密钥可能是某些主要密钥信息+不可编辑字段的组合

这是一个示例数据库表和数据:

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)列中。

7 个答案:

答案 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 ituuencode it

答案 3 :(得分:4)

如果您安装了mcrypt(我当前所有的PHP环境都有),您可以使用mcrypt_encryptmcrypt_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_uuencodeconvert_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

最好确保用于加密的密钥存储在安全的地方,但如果您并不真正关心安全性,那么您可能只需将密钥硬编码到您的代码中即可。