如果您需要生成字符串/令牌来验证未来的请求(例如API密钥,电子邮件确认网址等),应考虑哪些因素?
特别是
一个实际的例子
让我们从NodeJS中获取这两个输出字符串。
字符串1 (通过Node crypto)
var crypto = require('crypto');
crypto.randomBytes(48, function (ex, buf) {
console.log(buf.toString('hex'));
});
String 2 (通过Node UUID)
var uuid = require('node-uuid');
console.log(uuid.v4());
基于上面概述的概念,哪一个更安全,为什么?
此外,请随时就该主题提出任何好的介绍性材料,因为我无法在网上轻松找到有关此内容的文章。
答案 0 :(得分:6)
是什么让字符串"安全" /"很难猜到"?
字符串或令牌不能加密,因为它是static。
加密安全(伪)随机数发生器(CS(P)RNG)的概念描述了所产生的数字是不可预测的。它是程序的属性,而不是单个数字的属性。
"安全数额"测量/估计?
这取决于所使用的随机源,因为其中一些是黑盒子。您可以生成大量随机性,看看是否在那里找到了一些模式。有some test suites available,但是你必须考虑你的应用程序以及你需要多快的随机数。请求大量随机性可能耗尽池,然后产生不充分的随机数。
那里的主要标准是什么?
使用您系统的/框架指定的加密安全随机源。 Node.js的'如果您想信任文档,crypto.randomBytes()
就是其中之一。
一个实际的例子
node-uuid使用crypto.randomBytes()
internally,因此其背后的随机性基本相同,但如果Math.random()
不可用,它将回退到crypto.randomBytes()
。 Math.random()
is not cryptographically secure.如果您希望在浏览器中拥有加密安全的随机值,则需要查询Web加密API getRandomValues()
。