2010-12-13 41 views
8

我的PHP应用程序使用的URL像这样:简单的加密和解密使用PHP

http://domain.com/userid/120 
http://domain.com/userid/121 

键和URL的末尾基本上是MySQL数据库表的主键。

我不希望这个增加的数字是公开的,我也不希望有人能够通过交互Id来抓取用户配置文件。

所以我想加密这个ID用于显示的方式,我可以很容易地再次解密它。字符串不应该变得更长。

什么是最好的加密方法?

+2

我会建议在url中使用用户名,例如http://domain.com/user/jsmith。这是更多的Web 2.0,你保持你的主键的秘密,你不会通过加密/解密主键超载服务器 – aletzo 2010-12-13 14:19:55

+0

我真的想抵制说*你做错了*的冲动。首先,谁在乎用户配置文件是否可以被抓取?谷歌无论如何都会发现它们,所以没有什么真正的办法可以阻止它将它们放在登录页面后面(即使这样,有人希望信息也能得到它)。其次,为什么在网址中使用ID?为什么不使用唯一的用户名(用户名是唯一的,不是吗?)?它提供了比数字更多的语义含义,并且效率不应该低得多(假设你在用户名列中设置了'UNIQUE')... – ircmaxell 2010-12-13 14:22:21

回答

0

模糊URL永远不会保护它。它使阅读变得更难,但操作起来并不困难。你可以使用十六进制数字表示或类似的东西来掩盖它。这些谁可以读取十六进制可以改变你的URL在几秒钟,反正:

$hexId = dechex($id); // to hex 
$id = hexdec($hexId); // from hex 
6

一个更好的方法(从可用性和SEO的角度来看)是使用一个独特的词组,而不是模糊的ID。在这种情况下,用户的用户名似乎是理想的解决方案,并且也是不可猜测的。也就是说,如果你不想使用这种方法,你可以使用用户的用户名的散列(可能为md5),这些用户名将存储在数据库中以及其他详细信息中。因此,您可以直接在该领域进行查询。 (即:具有加密和解密的URL的一部分可能是矫枉过正。)

-1

生成每个用户的唯一的字符串,并在网址

http://domain.com/user/ofisdoifsdlfkjsdlfkj,而不是用它http://domain.com/userid/121

7

简单模糊: Base64使用base64_encode对它们进行编码。
现在,您的http://domain.com/userid/121变为:http://domain.com/userid/MTIx
想要了解更多信息,请再次添加一些字母。

坚韧模糊:使用任何使用MCrypt库的加密方法。

+0

你会如何区分简单和难以加密的加密? – 2010-12-13 14:23:53

+0

@Sandeepan,Simple很容易解密,并且不使用密钥,但是难以解密。 – shamittomar 2010-12-13 14:25:27

+0

您如何区分易于解密和难以解密? ;-) – 2010-12-13 15:00:21

1

最简单但功能强大的加密方法:与密钥异或。 http://en.wikipedia.org/wiki/XOR_cipher 没有实际的性能下降。

Base64表示不是加密!这是另一种说法。

希望这会有所帮助。

+0

谢谢你的base64评论,这不是一个加密。这需要说! – 2016-05-11 11:34:07

-1

可以使用base64_encodebase64_decode功能加密和解密您的网址

+0

+1来平衡谁给你反对票的人。你的答案并不是一个错误 – 2010-12-13 14:34:52

+1

downvote不是我的,但是base64_(en | de)代码不是(en | de)加密。它会稍微掩盖身份证号码,但以可预测的方式。 – Aether 2010-12-13 14:45:34

+0

base64不进行加密,任何开发人员都将轻松识别并能够解密该值,从而能够抓取页面。 – JohnSmith 2010-12-13 14:58:58

3

你有多种选择这里:

  • 生成并存储在数据库中的标识符。这很好,因为你可以拥有保证唯一的可读密钥。这很糟糕,因为它会导致数据库模式更改,并且每次要生成链接时都必须实际查询该表。

  • 运行实际的基于密钥的加密,例如基于PHP的MCrypt。您可以访问功能强大的加密算法,但大多数安全算法倾向于输出比您期望的时间长得多的字符串。异或做你想要的,但它不阻止访问顺序值(并且鉴于关于数字的先验知识,关键字很容易确定)。

  • 运行基于散列的验证:而不是使用121为您的标识,使用121-a34df6其中a34df6121md5(或其他HMAC)和密钥的前六个字符。您将提取121并重新计算六个字符,而不是解码,以查看它们是否与用户发送的内容匹配。这并不隐藏121(它仍然在连字符之前),但不知道密钥,访问者将无法生成六个字符来实际查看编号为121的文档。

  • 在混洗中使用XOR:将30位标识符中的位进行混洗,然后应用XOR。这使得XOR难以识别,因为洗牌模式也被隐藏起来。

  • 使用XOR与按需键:使用fb37cde4-37b3为你的钥匙,其中第一部分是121md5('37b3'.SECRET)的XOR(或生成基于37b3的XOR密钥和私密的另一种方式)。

不要使用BASE64,很容易进行反向工程:如果MTIx121,然后MTIy122 ...

最终,你将不得不接受您的解决方案将是不安全的:用户不仅可以泄漏有效的URL(通过浏览器历史记录,HTTP引用程序或将它们发布到Twitter上),而且您要求标识符适合少量字符,这意味着可能会发生暴力攻击(并且随着您开始拥有更多文档变得更容易)。

0

我可能会说,为每个用户创建一个随机字符串并将其存储在数据库中比使用散列获得一个更好。如果你使用一个常见的哈希,它仍然是很容易遍历所有页面;-)

我会写在评论中,但没有代表它(但?)。

0

当用户点击一个链接时,你不应该使用主键,你可以在会话中使用pkey并从该会话中获取。请不要使用查询字符串....