节点Express Regex检测无效字符

我们使用Node模块Crypto和Express来提供一些查询string和表单名称混淆。

'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'); }; 

使用的密钥很可能是一个随机的会话GUID,所以只要该会话有效,查询string就会有效。

我看到的问题是,如果一个会话GUID是不同于编码string,该函数仍然会解密hexstring,但结果将是无效的。

是否有正则expression式string(用于检测string中是否返回了任何非有效字符)或其他方式来确定是否使用了不同于其原始键的string来解码string?

我将很快创build一个快速中间件,它会查看每个传入的请求,并确定是否需要parsingreq.query或req.form,并尝试确定查询string是否正确解密。

这是我会做的。 如果您有一个要encryption的string,并且能够告诉您之后正确解密了该string,而不是像'abc'那样对一个空string进行encryption,则可以encryption对象的JSON表示forms,如{string: 'abc'} – 这将是一个string: '{"string":"abc"}'

你可以用这样的函数编码一个string:

 let encode = string => JSON.stringify({string}); 

现在encode('abc')返回一个string: '{"string":"abc"}'

当你解密一个string和JSON.parse()它会导致一个具有string属性的对象,那么你可以相当肯定,它不是随机的垃圾。

解密后,你可以用这样的函数来解码结果:

 let decode = json => { try { return JSON.parse(json).string; } catch (e) {} }; 

这将返回正确的JSON正确的string,但未定义为无效的JSON。

当然,你可以用许多不同的方式做这样的事情,但这是一个相当简单的方法,你不需要更改你的代码。

对于更强大的解决scheme,您可以使用JWT:

正在使用确保正确密钥的通常方法,并且/或者encryption的数据已被修改为对MAC进行encryption。 这意味着使用encryption密钥的派生来HMACencryption的数据并将HMAC结果附加到encryption的数据。 当解密encryption数据(less于HMAC结果)再次通过带有派生密钥的HMAC运行时,并与附加的HMAC值进行比较。 如果成功则解密数据,否则密钥或数据不正确。

所有这些都可能是不可接受的开销。 另一种方法是在encryption之前向数据添加一个小数据项(一个金丝雀 ),并在解密之后validation该值。 但是这对于一些攻击是不安全的。