什么使string/令牌密码安全?

如果您需要生成一个string/令牌来validation将来的请求(例如API密钥,电子邮件确认URL等),应考虑哪些因素?

尤其是

  • 是什么让string“安全”/“很难猜到”?
  • 如何测量/估计“安全量”?
  • 那里的主要标准是什么?

一个实际的例子

我们从NodeJS中获取这两个输出string。

string1 (通过节点密码 )

var crypto = require('crypto'); crypto.randomBytes(48, function (ex, buf) { console.log(buf.toString('hex')); }); 

string2 (通过节点UUID )

 var uuid = require('node-uuid'); console.log(uuid.v4()); 

基于上述概念,哪一个更安全,为什么?

另外,请随时提出有关这个主题的任何好的介绍材料,因为我不容易find关于这个在线的文章。

是什么让string“安全”/“很难猜到”?

string或标记不可能是encryption安全的,因为它是静态的 。

密码安全(伪)随机数发生器(CS(P)RNG)的概念描述了产生的数字是不可预测的。 这是程序的一个属性,而不是个别号码。

如何测量/估计“安全量”?

这取决于所使用的随机性来源,因为其中有些是黑盒子。 你可以产生很多的随机性,看看你是否在那里find一些模式。 有一些testing套件可用 ,但是你必须考虑你的应用程序,以及你需要多快这些随机数。 请求大量的随机性可能会耗尽池并产生不充分的随机数。

那里的主要标准是什么?

使用您的系统/框架指定的密码安全随机性来源。 crypto.randomBytes()是其中之一,如果你想相信文档。

一个实际的例子

node-uuid在内部使用crypto.randomBytes() ,所以后面的随机强度基本相同,但是如果crypto.randomBytes()不可用,它将回crypto.randomBytes() Math.random()Math.random() 不是encryption安全的。 如果你想在浏览器中有一个encryption的安全随机值,你需要查询Web Crypto API的getRandomValues()