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

Pen*_*ica 5 security random cryptography token node.js

如果您需要生成字符串/令牌来验证未来的请求(例如API密钥,电子邮件确认URL等),应考虑哪些因素?

特别是

  • 是什么让字符串"安全"/"非常难以猜测"?
  • 如何测量/估算"安全数额"?
  • 那里的主要标准是什么?

一个实际的例子

让我们从NodeJS中获取这两个输出字符串.

字符串1(通过节点加密)

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

字符串2(通过节点UUID)

var uuid = require('node-uuid');
console.log(uuid.v4());
Run Code Online (Sandbox Code Playgroud)

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

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

Art*_* B. 6

是什么让字符串"安全"/"非常难以猜测"?

字符串或标记不能加密安全,因为它是静态的.

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

如何测量/估算"安全数额"?

这取决于所使用的随机源,因为其中一些是黑盒子.您可以生成大量随机性,看看是否在那里找到了一些模式.有一些测试套件可用,但是你必须考虑你的应用程序以及你需要多快的随机数.请求大量随机性可能耗尽池,然后产生不充分的随机数.

那里的主要标准是什么?

使用系统的/框架指定的加密安全随机源.crypto.randomBytes()如果你想信任文档,Node.js' 就是其中之一.

一个实际的例子

node-uuid在crypto.randomBytes() 内部使用,因此它背后的随机性强度基本相同,但Math.random()如果crypto.randomBytes()不可用则会回退.Math.random()不是加密安全.如果您想在浏览器中拥有加密安全的随机值,则需要查询Web Crypto API getRandomValues().