我正在构建一个iOS应用程序,它连接到运行MongoDB的Node / Express.js后端,并使用Nginx作为反向代理。在客户端,我正在使用AFNetworking。当通过网络将密码作为加密的NSData
对象发送时,我遇到了一个问题(我正在使用带有AES 256位加密的RNCryptor)。
我有两个身份验证调用:
/api/signup (POST)
/api/login (POST)
signup
接受多部分请求并使用node-multiparty处理表单。
这是我的示例表单解析代码:
var deferred = q.defer();
var form = new multiparty.Form();
var image, email, userName, password, path = null;
//attach the image, create the user, and embed a session token.
form.on('close', function(){
console.log(password);
});
form.on('file', function(name, file){
path = file.path;
});
form.on('field', function(name, value){
if(name == "email"){
email = value;
}else if(name == "name"){
userName = value;
}else if(name == 'password') {
password = value;
}else return;
});
//user profile picture
form.on('part', function(part){
if (!part.filename) return;
if (part.name !== 'image') return part.resume();
image = {};
image.filename = part.filename;
image.size = 0;
part.on('data', function(buf){
image.size += buf.length;
});
});
// parse the form
form.parse(request);
return deferred.promise;
当密码记录到控制台时,我得到预期的输出,主要是随机的acsii字符(例如G Bgq g +)。
对于登录呼叫,它不是多部分请求,密码参数仅存在于request.body.password
中。当我使用相同的密码记录该属性时,我得到这样的信息:
< 03018858 90f432f1 3230fc6d 3b419e06 a7d1b382 dab31581 4f622184 9d412ba2 1a7ddbda c416e203 57fee0e0 bf553ddf ace1e8c7 af098c5e f5c37b59 68ceb8c4 36dbf12e 3a9d3d15 fdbe5aee bb19bc94 2a8d>
看起来多部分请求中的password参数被解析为字符串值,而普通post请求中的password参数将被记录到NSData
对象的Xcode控制台。
现在我无法弄清楚这种情况发生在哪里,如果它在客户端使用AFNetworking(可能它处理不同于多部分的NSData
参数)或者它是节点多方的结果。即使这样,我也不确定如何缓解这个问题,除了不必要地将常规POST
调用更改为多部分请求,这样我就可以获得相同的行为。任何帮助或见解将不胜感激。
编辑:我觉得我应该提到我的应用中的密码首先使用RNCryptor
进行加密,然后发送到后端并使用bcrypt再次加密。我遇到的问题是在客户端输入相同的密码时,尽管运行相同的加密过程,但它们在服务器上不匹配。