什么使字符串/令牌加密安全?

时间:2015-08-12 13:16:22

标签: node.js security random cryptography token

如果您需要生成字符串/令牌来验证未来的请求(例如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());

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

此外,请随时就该主题提出任何好的介绍性材料,因为我无法在网上轻松找到有关此内容的文章。

1 个答案:

答案 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()