【问题标题】:How to encrypt integer to another integer with salt/password?如何使用盐/密码将整数加密为另一个整数?
【发布时间】:2015-12-24 06:46:34
【问题描述】:

我试图通过将整数加密为另一个整数,使其看起来是随机的,从而向用户隐藏数据库自动递增的 ID(1 到 PHP_INT_MAX)。

我考虑过异或

$mySecretNumber = 123456789;
$idToHide = 10;
$encryptedId = ($idToHide ^ $mySecretNumber);

但是(我认为)这个密码很容易被找出来。

如何使用可以指定盐/密码的更安全的方法来执行此操作?

编辑

为了清楚起见,我需要(看似随机地)将 1 到 PHP_INT_MAX 范围内的整数映射到同一范围内的另一个整数。

【问题讨论】:

  • trying to hide them - 你能详细说明一下吗?当然,将您的自动递增 ID 更改为某个随机加密数字并不是正确的方法。
  • @Ohgodwhy 我的意思是在 url 或 REST api 响应中显示时隐藏它们。
  • 为什么不用真正的加密功能?
  • 为什么必须映射到整数?只需使用加密功能,然后在将其发送回服务器时对其进行解密。
  • 当然,但他们并没有尝试加密它们。

标签: php encryption


【解决方案1】:

您是否只是想混淆 ID 号,例如在 URL 中使用? Encryption is the wrong tool for the "URL paremeter obfsucation" job

使用单独的随机值并维护“随机值”“整数”的服务器端查找而不是加密。

除非您是一名密码学工程师,并且多年来一直在破解密码软件(大多数人在 Stack Overflow 上提出此类问题的人都不是),否则您应该避免像瘟疫一样实施密码学。在你学得足够多之前,你几乎肯定会写出易受攻击的代码。

另见:Write crypto code! Don't publish it!

【讨论】:

  • 原因似乎很片面。 1.关于安全性,它并不是真正需要的。目的是对普通用户隐藏 id。 2.关于“编写易受攻击的代码”,网上公开了很多算法的源代码。
  • 另外,在使用你的方法时,既然可以生成一个随机整数/bigint,为什么还要生成一个随机字符串,然后在输出前根据需要对其进行编码?
  • @tumber033 阅读此内容,然后问问自己,您是否认为您可以编写我无法破解的加密代码:paragonie.com/security -- 第二步:意识到我并不特别,如果我能破解它,很多人也可以!
【解决方案2】:

ECB 模式下的任何对称加密都可以,只要块大小为 64 位并且密钥大小足够大,例如 TDES 为 112 或 AES 为 128,但结果的范围将是完整的 64 位。但是 TEA 被认为很弱,因此不适合。

【讨论】:

  • “但 TEA 被认为很弱,因此不适合。”同样是:ECB mode、块大小
  • 这是关于加密 64 位数字,而不是任意长度的文本。欧洲央行是最适合这种情况的模式,已知的弱点无关紧要。任何其他模式而不是 ECB 都没有取得任何成果,因为我们只有一个输入块,因此没有链接。 TDES 的块大小为 64 位,密钥长度为 112 位,对于这些类型的使用来说并不弱。
  • 好的,那么你建议某人编写自己的加密货币,他们为选择密文攻击打开了大门,并被聪明的攻击者攻击。
  • @Scott。请详细说明。我不认为这是我的建议。
  • 1.继续发送垃圾块而不是真正的加密值。 2. 最终解密一个类似X' or '1'='1' --的字符串(两个64位块)。 3. 如果这被盲目地用于构造 MySQL 查询,那么您只是在选定的密文上获得了 SQLi。除非您还对密文进行身份验证,否则会增加 URL 大小。
【解决方案3】:

我通过使用 TEA 加密算法(64 位分组密码)解决了这个问题。

请注意,范围不是从 1 到 PHP_INT_MAX,而是从 PHP_INT_MIN 到 PHP_INT_MAX(对于 64 位 PHP)。

如果您认为我的方法有什么问题/不好,请告诉我。

另外,我发现了 2 个非常有用的主题: Obfuscating an ID, Symmetric Bijective Algorithm for Integers

编辑

我选择 TEA 算法只是因为它简单快速,而且安全性不是很重要的优先事项。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 2014-01-24
  • 2021-08-05
  • 2010-09-24
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
相关资源
最近更新 更多