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

标签 php encryption encoding obfuscation

我需要在我的 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/

相关文章:

PHP - spl_autoload 和命名空间 - 不适用于大写字母

javascript - JS S3 对象访问计数

Android 安全/加密套接字

Cocoa:如何处理网页中无效的 utf-8 字节

php - 在 MySQL 的 INNER 查询中获取空数组

php - 从 Symfony2 中的实体填充表单数据

java - 具有不同字母长度的替换密码

javascript - 使用 CryptoJS 在 Javascript 中加密并在 Java 中解密

java - 什么编码使这些字符与卡隆一起变成不同的东西

python - Python编码检测,用不用chardet库?