2014-02-14 34 views
0

我正在开发一个系统,其中将为每个用户创建一个QRCode徽章,我需要阅读该QRCode并在公共屏幕上向用户显示特定信息。使用部分MongoDB ID密钥是否安全

QRCode阅读有点“棘手”。当我做了这样的事情时,我使用了枚举ID(1,100,2304,9990)的MySQL ......女巫只有大约5个字符。

但是,MongoDB密钥(我现在使用的DB)由一个biggg密钥组成,如52d35bf26bda8a5c8f8a22a8女巫拥有许多字符。

这是什么问题:QRCode变得更大(更多的数据,更大的尺寸),并变得更难以在WebCam(甚至在HD)上快速阅读它。

所以,这里是我的想法:使用部分Id,所以:52d35bf26bda8a5c8f8a22a8也许变成52d35bf26bd

问题很简单:我可以安全地使用部分ID密钥,而不必重新发生?我将拥有的最大元素将是大约1000阶。

这个问题与QRCode无关,但它解释了我为什么要这样做。

+0

否...剪裁ObjectId并将其用作唯一标识符是一个坏主意。它可能更好地散列到你想要的大小(碰撞仍然是可能的)。你可以阅读ObjectId是如何在这里构建的:http://docs.mongodb.org/manual/reference/object-id/ – joao

+0

@joao,看起来ObjectID以3byte计数器结束,女巫随机启动,但它不可冲突。我对吗? –

+0

如果您删除了多个文档,它们将在相同的秒,机器和进程中插入,它们将发生冲突。这是一个相当危险的情况,因为在1秒内有超过1插入是很容易实现... – joao

回答

0

的ObjectId是一个12字节的BSON类型,使用构造:

表示自Unix纪元秒, 3字节机器标识符, 2字节进程id一个4字节的值,和 一个3字节的计数器,从一个随机值开始。

一旦知道,这取决于您选择的对象ID的一部分,有多少时间将在插入之间传递。

问候

0

无论它是安全与否,QR码的大小差异不是很大。

使用完整的字符串会得到你喜欢的图片: Big QR

使用半个汉字产生像代码: Small QR

我建议,即使是最便宜的智能手机将能够扫描两幅图像中较大的一幅 - 根本不是很复杂。

+0

是的,因为它不是一个人手上的智能手机,它会读取它。这将是一个网络摄像头,人们的徽章将在相当远的距离内摇动,弯曲和反射灯光......我已经这样做了一年多了,这就是我可以告诉它的事情......更小的更好。 –

0

是的,您可以安全地将长十六进制字符串压缩到更高的基数,以获得更少的字符,同时保留相同的值。

实施例:

十六进制:52d35bf26bda8a5c8f8a22a8

的Base64:UtNb8mvailyPiiKo

同样的想法可以进一步通过使用代替BA​​SE64二进制或甚至中国象形字符作出。

这个概念可以使用Numeral Base Converter Tool进行测试。