在 PHP 中对某些纯文本数据进行模糊处理或加密

2022-08-31 00:11:44

我需要在我的php 5.2应用程序中混淆或加密一些纯文本数据。

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

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

关键考虑因素

  • 编辑添加我更喜欢一个让输入字符串和输出字符串保持相同长度的解决方案。
  • 只有字符串文本将被模糊处理/加密以存储在数据库中
  • 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) 列中。


答案 1

对于简单的混淆,请使用 strtr() - 翻译某些字符:
字符串 strtr ( 字符串 $str , 字符串 $from , 字符串 $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 ([+,-!#$%&*])"

如有必要,您可以在DB中轻松复制此逻辑(无需循环):使用Erland Sommarskog的表格


答案 2

base64 编码怎么样?我们用它来使开发人员无法读取SMS网关数据库中的SMS消息。


推荐