簡體   English   中英

使用PHP和MySQL生成強大的唯一用戶ID

[英]Generating Strong Unique User ID's w/PHP & MySQL

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)?

---------------------- Thanks for reading :) -------------------------------

一件事:如果你不相信用戶的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核心的一部分,所以你必須假裝一點。

如果您使用用戶ID作為允許用戶對您的服務進行任何操作的方式,如果一個用戶“猜測”另一個用戶的用戶ID,他將能夠用他們的帳戶做他想做的任何事情嗎?

你沒有任何其他密碼或其他任何東西?


那么,在這種情況下,你需要一些非常獨特的東西,不是嗎;-)
(希望我能很好地理解這個問題 - 但情況可能並非如此 - 抱歉,如果不是這樣的話)

61350955-9755-4AF3-8C19-6DBC42CA69E2為您的用戶使用全球唯一標識符 (例如, 61350955-9755-4AF3-8C19-6DBC42CA69E2 )?
有關它們的外觀的示例,請查看http://createguid.com/


作為旁注,GUID很長; 這意味着你的數據庫中有很多字節,如果你有數百萬用戶......那么,它可能不應該被用作任何類型的主/外鍵。

如何使用最小的整數(符合您將擁有的用戶數)作為主鍵/外鍵,因為該鍵將在應用程序的許多位置重復; 並且只在用戶表中只存儲一次“長用戶ID”?

我寫了這個類,它給你一個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

你有沒有考慮使用UUID

快速谷歌搜索產生一些良好的資源/鏈接。

我個人使用md5(uniqid(mt_rand(),true)),它將創建極難預測的32個字符標識符(128位十六進制數)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM