我们使用 Node 模块 Crypto 和 Express 来提供一些查询字符串和表单名称混淆。
'use strict';
var algorithm = 'aes-256-ctr'
, crypto = require('crypto')
;
var enc = function(string, key){
var cipher = crypto.createCipher(algorithm, key);
var buff = Buffer.from(string, 'utf8');
return Buffer.concat([cipher.update(buff), cipher.final()]).toString('hex').toUpperCase();
};
var dec = function(string, key){
var decipher = crypto.createDecipher(algorithm, key);
var buff = Buffer.from(string, 'hex');
return Buffer.concat([decipher.update(buff), decipher.final()]).toString('utf8');
};
使用的 key 很可能是随机 session GUID,因此查询字符串仅在该 session 有效时有效。
我看到的问题是,如果 session GUID 与编码字符串的 GUID 不同,该函数仍将解密十六进制字符串,但结果将无效。
是否有正则表达式字符串(用于检测字符串中是否返回任何无效字符)或其他方式来确定是否使用不同的 key 来解码字符串而不是原始 key ?
我将很快创建一个快速中间件,它将查看每个传入的请求并确定 req.query 或 req.form 是否需要解密,并尝试确定查询字符串是否已正确解密。
最佳答案
这就是我要做的。如果您有一个想要加密的字符串,并且能够在事后得知您已正确解密它,那么您可以加密一个对象的 JSON 表示形式,而不是加密像 'abc'
这样的裸字符串{string: 'abc'}
- 这将是一个字符串:'{"string":"abc"}'
您可以使用如下函数对这样的字符串进行编码:
let encode = string => JSON.stringify({string});
现在 encode('abc')
返回一个字符串:'{"string":"abc"}'
当您解密字符串并使用 JSON.parse()
进行解密时,它会生成一个具有 string
属性的对象,那么您可以相当确定它不是随机垃圾。
解密后,您可以使用如下函数解码结果:
let decode = json => { try { return JSON.parse(json).string; } catch (e) {} };
对于正确的 JSON,它将返回正确的字符串,但对于无效的 JSON,则返回未定义的字符串。
当然,您可以通过许多不同的方式执行类似的操作,但这是一种相当简单的方法,您不需要对代码进行太多更改。
要获得更强大的解决方案,您可以使用 JWT:
关于node.js - Node Express 正则表达式检测无效字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43190018/