我需要在我的 php 5.2 应用程序中混淆或加密一些纯文本数据。
我更喜欢输入字符串和输出字符串保留相同长度的解决方案。
这不需要非常强大,因为还有许多其他安全层。强固然好,但这只会防止程序员/dba/支持人员/等意外地从数据库中读取文本。
主要考虑因素
- 编辑添加我更喜欢输入字符串和输出字符串保留相同长度的解决方案。
- 只有字符串文本会被混淆/加密以存储在数据库中
- PHP 应用程序需要在数据库保存之前对数据进行混淆/加密,并且需要在数据库读取后取消混淆/加密
- 这是对现有应用程序的修改
- 只有某些列需要混淆/加密
- 只有某些行需要根据类型字段进行混淆/加密
- 只需处理几个加载/保存点
- 某些字段的最大列大小已确定,但其他字段尚未确定,但我更喜欢在受限字段的现有大小范围内使用的解决方案
- 编辑、添加键可能是一些主键信息+不可编辑字段的组合
这是一个示例数据库表和数据:
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) 列中。
最佳答案
为了进行简单的混淆,请使用 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
关于php - 在 PHP 中混淆或加密一些纯文本数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1043621/