使用节点生成 API 令牌 - 大写、小写字母和数字?

lau*_*kok 3 token api-key node.js express

我正在尝试在expressjs 中生成唯一的密钥/令牌。我正在使用帽子。但它生成的密钥是数字和小写字母:

1b1a7af4e304fc0fa49216ce248ae574
Run Code Online (Sandbox Code Playgroud)

我的代码:

var express = require('express');
var hat = require("hat");
var app = express();

app.get('/', function (req, res) {
    res.send(hat());
});
Run Code Online (Sandbox Code Playgroud)

但我更喜欢这样的键(大小写和数字的混合):

EzpoQlgvQESADxzAQX94uwPgoYX
Run Code Online (Sandbox Code Playgroud)

有什么想法我应该使用什么节点包来创建这样的密钥(大小写和数字的混合)?

顺便问一下,这两种类型的密钥有什么区别?哪个更安全、更好?

Ian*_*her 5

至于以这种形式生成唯一的密钥,我不确定是否有一个库,但最简单的解决方案可能是取消任何第三方代码并使用单行代码,例如var key = require('crypto').randomBytes(64).toString('base64');这将为您提供同样好的结果,让您控制碰撞概率并定制适合的按键。

至于你的第二个问题哪个更好,这取决于你对更好的分类。

诸如此类的键的主要目标是它们的水平。简而言之,同时使用大写和小写字母和数字会将每个字符的熵增加到 62 种可能的组合,而仅使用小写字母和数字则会将你的每个字符的熵增加到 36 种可能的组合。

这意味着就熵而言,同样是简单的术语,62 个字符的小写+数字密钥与 36 个字符长的大写+小写+数字密钥一样有效。

虽然较短的密钥可能对您的情况(或偏好?)有用,但您可能会遇到不同技术的问题,这些技术可能不区分大小写。

  • 是的,这只是一个快速的解决方案,但如果您热衷于使用它,您可以使用类似`require('crypto').randomBytes(64).toString('base64').replace(/[^A-Za -z0-9]/g, "").substring(0,16)` 为您提供仅包含字母数字的 16 个字符的字符串。但这显然不是一个适当的安全意识方法 (4认同)