Ahoy Stack Overflow!这是mai的第一篇帖子......
我正在尝试使用加密的唯一公钥来识别用户。
AUTO_INCREMENT_PK
+ CREATED_TIMESTAMP
)是否足够?熵更多?
auto_increment
主键。如前所述,可能有数亿个密钥。根据加密算法,我应该有一个固定大小的ID。我可以保留INT(255)还是应该使用CHAR(n)? ---------------------- Thanks for reading :) -------------------------------
答案 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;
}
}
答案 3 :(得分:0)
您是否考虑过使用UUID?
快速google search会产生一些好的资源/链接。
答案 4 :(得分:0)
我个人使用md5(uniqid(mt_rand(),true)),这将创建极难预测的32个字符标识符(128位十六进制数)。