[英]Generating Strong Unique User ID's w/PHP & MySQL
Ahoy Stack Overflow! 這是mai的第一篇帖子......
我正在嘗試使用加鹽的唯一公鑰來識別用戶。
AUTO_INCREMENT_PK
+ CREATED_TIMESTAMP
)是否足夠? 熵更多?
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;
}
}
我個人使用md5(uniqid(mt_rand(),true)),它將創建極難預測的32個字符標識符(128位十六進制數)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.