【问题标题】:Hashing or encrypting variables to be sent in a url散列或加密要在 url 中发送的变量
【发布时间】:2012-05-17 18:54:46
【问题描述】:

我有一个需要生成的链接,以便可以将其放入电子邮件中。当用户点击此链接时,系统将匹配电子邮件中发送给用户的代码,以便提取该用户的记录。

但是,我不太确定要使用哪种加密/散列方法。对于本站管理系统的登录,我使用数据库中的 PBKDF2 作为密码(加盐)和 AES 加密,当它发送到会话变量时,但我不知道 PBKDF2 和 AES 使用的字符是否网址兼容。

基本上,我需要散列/生成随机代码以存储在数据库中的最佳方法和一种加密方法,以便我可以将年份和代码(我之前提到过)放在 url 中。如果有帮助,我正在使用 PHP 和 MySQL。

你们觉得呢?

【问题讨论】:

  • 不用担心:只要编码正确,URL 可以表示任何字符,甚至是多字节字符。

标签: php mysql url encryption hash


【解决方案1】:

按照您的意愿执行散列,然后在将结果插入 URL 之前urlencode()

【讨论】:

    【解决方案2】:

    大多数加密(或散列等)例程的输出是任意二进制数据,如果不对其进行编码,就无法安全地将其包含在 URL 中。

    As eggyal notes,只需在数据上使用urlencode() 就足够了。然而,标准的 URL 编码可能不是编码随机二进制数据的最紧凑方式。 Base64 编码会更有效,但不幸的是,由于使用了+ 字符,因此它并不完全是 URL 安全的。

    幸运的是,base64 编码有一个标准化的 URL 安全变体,在 RFC 4648 中指定为“base64url”。下面是一对在 PHP 中使用这种编码对数据进行编码和解码的函数,based on this answer by "gutzmer at usa dot net"

    function base64url_encode($data) {
        return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
    }
    
    function base64url_decode($data) {
        return base64_decode(strtr($data, '-_', '+/'));
    }
    

    (我稍微简化了解码功能,因为至少当前版本的 PHP 显然不需要在 base64_decode() 的输入中使用 = 填充字符。)


    附言。为了首先安全地生成随机令牌,请参见例如this question.

    【讨论】:

    • 如果我们使用base64,那么使用php的base64_encode()和base64_decode()函数怎么样?
    • @Phil:我使用它们,但它们需要与strtr() 结合以产生 URL 安全输出。
    • @llmari 存储从该链接获得的用于生成代码的伪随机字节的最佳方法是什么?
    • @Phil:商店在哪里?在 PHP 中,一个普通的字符串变量就可以了。在 MySQL 中,BINARY(16) 列是合适的。
    • 确实,我发现如果我这样做 myserver/controller/myaction/myId 并且 myId 是带有“+”号或其他字符的哈希,即使我在构建 url 时使用 encodeUriComponent,aspnet mvc 也会抱怨这一点。所以确实这里的解决方案应该是改变你的哈希算法
    猜你喜欢
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2013-04-06
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多