使用microtime作为唯一标识符的可能性

时间:2015-11-03 23:44:44

标签: javascript php

如果用户提交的微缩时间值随后由服务器会话跟踪。是否可以跟踪微缩时间,类似于RSA样式密码短语用于加密从服务器发送和接收的数据。

这对于自动/动态密码生成是一种可靠的方法。

不确定这是否是正确的堆栈。

1 个答案:

答案 0 :(得分:3)

我认为这里有几个问题,所以我会在实际问题出现之前尝试解决这些问题:

  

使用microtime作为唯一标识符

只有在你从未在相同的微秒中生成两个标识符并且你的时间函数真正测量的微秒时间是单调的(总是增加)时才会起作用。这三个都是不稳定的假设。

很有可能在相同的微秒内生成两个标识符。您的时间函数可能没有您认为的精度,或者数据类型所暗示的精度(例如,它可能始终返回以000结尾的值)。最后,夏令时和leap seconds等内容可能会将时间向后转换,最终会重复使用ID。

所以不,microtime作为唯一标识符在生产中不是一个好主意。

  

RSA风格密码

RSA是一种非对称密钥加密系统。它允许各方拥有公共和私人密钥,这些密钥源自真正的随机数,并以合理的安全性发送加密和/或签名的数据。 RSA公钥如下所示(十六进制模数):

af 46 03 ce c7 13 e6 2e 93 d8 56 91 b1 31 8d 0a 
22 c1 f0 eb 4f 5e ef 0d f6 20 32 b9 a4 4e 87 f9 
d2 d2 44 51 b0 df 30 50 c9 35 4e 68 19 84 fb 98 
33 aa 05 4b 7e fb 57 c5 b6 2e a8 4b 04 ca cf 5e 
2e e5 9e 1b ca b7 60 c5 58 2c b0 df c4 6b 0d b1 
2c 33 97 73 54 61 2b 9a 1b b1 dc 5d 10 a9 c4 c8 
f7 6c e3 55 6e b5 0e 61 3b 35 24 0b 89 1e 32 a2 
75 69 4e 97 40 68 ee 23 48 f2 71 9f c7 7e e2 9d 
6c 22 55 36 24 64 a4 f0 b6 52 58 5a 9a 44 e7 3b 
2a d5 ed 95 63 f8 1d a8 4d 45 9b 5d c2 f2 f9 74 
81 06 18 d5 b1 fb b0 7e 5d 50 1f 63 5c a0 73 f5 
22 b2 57 64 03 e6 b7 0f 6f b7 58 0b 57 80 56 51 
65 9f f5 09 61 63 29 62 4d 30 02 3a 64 10 2d 95 
b8 12 36 04 58 c5 d7 1d 95 e2 21 3c b0 b3 93 35 
b2 b1 f9 6d 7e 20 66 b2 68 33 e9 50 a8 15 1e 0a 
80 9a 3c 19 dd cc 79 35 a8 8c 1b 61 33 5d 12 2f 

密码短语是由用户选择的长串字母和符号(通常),用于提供身份验证或生成可重复的随机数(例如,用于比特币的脑钱包)。密码短语如下:

correct horse battery staple

" RSA 风格密码"是一个非常奇怪的表达,我不知道你的意思,但表明你可能会有一些误解。

  

用于散列从服务器发送和接收的数据

为什么要对从服务器发送和接收的数据进行哈希处理? 散列意味着占用一些字节并将其超出识别范围,以一种难以猜测的可重复方式将其缩小。像TLS这样的安全通道可能会在内部使用散列,但对于使用它的程序员来说它应该是完全不可见的。

也许代替哈希意味着加密。加密正在获取一些数据和密钥,并以只有持有密钥的人可以撤消该过程的方式对其进行修改。另一方面,哈希没有密钥,并且(希望)无法撤消。这可能看起来像挑剔,但加密是微妙,需要极度关注。

抛开投诉,回答你的问题。

如果我理解正确,您希望使用具有微秒精度的系统时钟来生成某种密钥材料(密钥,密码,随机数或等效)以保护客户端 - 服务器通信(哈希以确保完整性,加密,或类似的东西)。

这可能有意义,因为攻击者永远不会知道您生成密钥的确切微秒。数据类型相当大,可能是128位,是一个好密钥的大小。

但是时间不是随机的。攻击者并不知道确切的微秒,但他们可以猜测。如果他们知道时间,他们只有60 * 60 * 1000 * 1000 = 3600000000,不到40亿的可能性。对于加密技术,我们认为攻击者可以在不到一秒的时间内完成许多猜测。 40亿只是32位的安全性,保护数据的数量可以忽略不计。

根据现代最佳实践提出的解决方案:

  • 如果您只需要唯一标识符,则不需要加密:使用UUID version 4,它几​​乎可以在所有语言中实现。他们在5316911983139663491615228241121378304中有一次碰撞机会,这应该足够了。但他们是可以猜到的。

  • 如果您需要用于加密目的的唯一/随机值(并且您是知道自己在做什么的密码学家):在Linux上使用/dev/urandom,可以作为大多数语言的CryptoRandom库。

  • 如果您想在客户端和服务器之间建立安全通道:请使用TLS。您很快就可以从StartSSLLet's Encrypt获得免费证书。我建议使用像nginx这样的代理处理TLS / SSL的东西,然后你可以在主应用程序中使用普通的HTTP。

  • 如果您想以其他方式安全地交换数据:请使用已移植到多种语言的NaCl library。它具有使用安全默认值和最先进的加密来加密和签名数据的功能。

这并不意味着打击你。只是密码学很难,你只有一次机会。所以请小心。如果您是密码学家或想要了解更多信息,我建议您询问Security community