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

KM.*_*KM. 13 php encryption obfuscation encoding

我需要在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
Run Code Online (Sandbox Code Playgroud)

应用程序将正常加载和显示行1,2和4.但是,它会有条件地(基于行类型)使用此混淆/加密和非混淆/解密逻辑来处理第3行中的文本.

任何人都可以提供混淆/加密和非混淆/解密功能代码,链接和/或指针,这将有所帮助吗?

谢谢!

编辑
我喜欢简单的base64编码理念,但有一种方法可以将数据保持在固定的大小.到目前为止列出的所有方法的输出值都大于输入值.对于某些列,这将是一个问题,用户可以输入50个字符并将其存储在varchar(50)列中.

KM.*_*KM. 18

对于简单的混淆使用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©Ü¬­®¢¤¥¦§«Þª"
Run Code Online (Sandbox Code Playgroud)

在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 ([+,-!#$%&*])"
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以轻松地在数据库中复制此逻辑(无需循环):使用数字表,由Erland Sommarskog


kar*_*m79 7

如何base64编码?我们使用它来使我们的SMS Gateway DB中的SMS消息不被开发人员读取.

  • 您是否聘请了无法发现和解码base64的开发人员?(开玩笑,无法抗拒......) (11认同)
  • 存在一些锁只是为了让诚实的人诚实. (5认同)
  • @David Thomas实际上你可以"保持诚实的人诚实".想象一下 - 你必须使用包含私人短信的数据库,而你是一个诚实的人,不想阅读这些私人信息.如果消息以纯文本形式存储,您将无法"不读取它们",因为您无法在大脑中关闭"阅读模式".阅读私人内容可能会让你感觉不那么诚实,因此base64足以防止这种情况发生.它不能防止不诚实,但它有助于防止不想看到私人信息的诚实开发者感到不适. (5认同)
  • 我们担心的不是'加密'只是为了让它"不易读".我是其中一个开发人员,是的,我可以在一秒钟内解码任何一个. (2认同)

Óla*_*age 5

有几个选择.

如果你想要非常强大,你可以看看mcrypt.

但是,如果它只是如此有效,开发人员无法阅读文本,而无需实际操作.然后你可以只对BASE64进行编码对其进行编码


ati*_*ruz 5

试试这些 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
Run Code Online (Sandbox Code Playgroud)