我试图通过将整数加密为另一个整数,使其看起来随机,来向用户隐藏数据库自动递增的ID(1到PHP_INT_MAX)。
我考虑过做XOR
$mySecretNumber = 123456789;
$idToHide = 10;
$encryptedId = ($idToHide ^ $mySecretNumber);
但是(我认为)这个秘密号码很容易就能算出。
如何使用更安全的方法来指定salt/password?
编辑
为了清楚起见,我需要(看似随机)将1到PHP_INT_MAX范围内的一个整数映射到同一范围内的另一个整数。
您是否试图混淆ID号,例如在URL中使用加密是"URL参数obfseducation"作业的错误工具。
使用单独的随机值并保持服务器端查找"随机值"<->"integer"而不是加密。
除非你是一名密码学工程师,多年来一直在破解加密软件(大多数在Stack Overflow上问这类问题的人都不是),否则你应该避免像瘟疫一样实施密码学。你几乎肯定会在学到足够的知识之前编写易受攻击的代码。
另请参阅:编写加密代码!不要发布!
ECB模式下的任何对称加密都可以做到,只要块大小为64位,并且密钥大小足够大,例如TDES为112或AES为128,但结果的范围将是完整的64位。但技经评估被认为是薄弱的,因此不适合。
我使用TEA加密算法(64位分组密码)解决了这个问题。
请注意,范围不是从1到PHP_INT_MAX,而是从PHP_INT_MIN到PHP_INT_MAX(对于64位PHP)。
如果你认为我的方法有什么问题,请告诉我。
此外,我发现了两个非常有用的主题:混淆ID,整数的对称双目标算法
编辑
我之所以选择TEA算法,只是因为它简单快捷,安全性不是一个重要的优先事项。