什么使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()
。