使用/ PHP生成强大的唯一用户ID; MySQL的

时间:2009-08-06 18:57:07

标签: php mysql security optimization hash

Ahoy Stack Overflow!这是mai的第一篇帖子......

我正在尝试使用加密的唯一公钥来识别用户。

  1. 算法 - 我应该使用uniqid(),sha256,sha512,还有其他什么?所有的哈希都会被腌制。 NIST推荐使用SHA256,但我更愿意听听别人的建议。
  2. 生成 - 哈希(SALT + AUTO_INCREMENT_PK + CREATED_TIMESTAMP)是否足够?熵更多?
    • 我使用电子邮件,因为它对每个用户都是唯一的,但是用户可以修改他们的电子邮件地址。我还在考虑存储signup_email,以便不必重新计算哈希值。
  3. MySQL存储 - 目前,我们的ID是INT(255)auto_increment主键。如前所述,可能有数亿个密钥。根据加密算法,我应该有一个固定大小的ID。我可以保留INT(255)还是应该使用CHAR(n)?
  4. ---------------------- Thanks for reading :) -------------------------------

5 个答案:

答案 0 :(得分:5)

一件事:如果您不信任具有其ID的用户,则通过GET或POST发送它们将不起作用;这些对于有动力的用户都是可见的。


我将使用salt.counter.time字符串使用SHA256,并使用输出为实际id生成GUID。这样可以最大限度地减少碰撞的可能性。

您必须使用CHAR for MySQL来存储GUID。

有关更深入的信息,请参阅http://us2.php.net/manual/en/function.uniqid.php上的评论。 AFAIK GUID不是PHP核心的一部分,所以你必须假装它。

答案 1 :(得分:3)

如果您使用用户ID作为允许用户对您的服务执行任何操作的方式,如果一个用户“猜测”另一个用户的用户ID,他将能够使用该帐户执行任何他想要的操作?

您没有任何其他密码或其他任何内容?


那么,在这种情况下,你需要一些非常独特的东西,不是吗;-)
(希望我能很好地理解这个问题 - 但情况可能并非如此 - 抱歉,如果不是这样的话)

您如何看待为您的用户使用Globally Unique Identifier(例如,61350955-9755-4AF3-8C19-6DBC42CA69E2)?
有关它们的外观的示例,请查看http://createguid.com/


作为旁注,GUID很长;这意味着你的数据库中有很多字节,如果你有数百万用户......那么,它可能不应该被用作任何类型的主/外键。

如何使用尽可能小的整数(适合您拥有的用户数)作为主键/外键,因为该键将在应用程序的许多位置重复;并且只在用户表中只存储一次“长用户ID”?

答案 2 :(得分:1)

我写了这个类,它给你一个24个字符的唯一id,与MongoDB的id字段兼容(并使用相同的逻辑来构造它)。可能在将来有用。

<?php
/**
 * Generator for Mongo-like ObjectIds in pure PHP
 * Author: Mauricio Piacentini
 *
 * Inspired by https://github.com/justaprogrammer/ObjectId.js
 *
 */

class ObjectIdFactory
{   
    private $_datetime = null;
    private $_machine = null;
    private $_pid = null;
    private $_increment = null;

    public function __construct()
    {
        $this->_machine = str_pad(dechex(rand(0, 16777215)), 6, "0", STR_PAD_LEFT);
        $this->_pid = str_pad(dechex(rand(0, 32767)), 4, "0", STR_PAD_LEFT);
        $this->_increment = rand(0, 16777215);

        //We need a DateTime object to get timestamps, cache it
        $this->_datetime = new DateTime();
    }

    public function getNewId($forcedincrement = null)
    {
        if (is_null($forcedincrement)) {
            $this->_increment++;
            if ($this->_increment > 0xffffff) {
                $this->_increment = 0;
            }
        } else {
            $this->_increment = $forcedincrement;
        }
        $timestamp = $this->_datetime->getTimestamp();

        $timestamp_final = str_pad(dechex($timestamp), 8, "0", STR_PAD_LEFT);
        $increment_final = str_pad(dechex($this->_increment), 6, "0", STR_PAD_LEFT);
        return $timestamp_final . $this->_machine . $this->_pid . $increment_final;
    }

}

https://github.com/piacentini/ObjectId.php

答案 3 :(得分:0)

您是否考虑过使用UUID

快速google search会产生一些好的资源/链接。

答案 4 :(得分:0)

我个人使用md5(uniqid(mt_rand(),true)),这将创建极难预测的32个字符标识符(128位十六进制数)。