我正在构建一个 iOS 应用程序,它连接到运行 MongoDB 的 Node/Express.js 后端并使用 Nginx 作为反向代理。在客户端,我正在使用 AFNetworking。当通过网络将密码作为加密的NSData对象发送时,我遇到了一个问题(我使用带有 AES 256-bit 加密的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 参数将被记录到 Xcode 控制台以获取NSData对象。

现在我无法弄清楚这种情况发生在哪里,如果它在客户端使用 AFNetworking(可能它处理多部分的NSData参数不同)或者它是 node-multiparty 的结果。即使这样,我也不确定如何缓解这个问题,除了不必要地将常规POST调用更改为多部分请求,这样我就能得到相同的行为。任何帮助或见解将不胜感激。

编辑:我觉得我应该提到我的应用程序中的密码首先使用RNCryptor加密然后发送到后端并再次使用bcrypt加密。我遇到的问题是在客户端输入相同的密码时,尽管运行相同的加密过程,但它们在服务器上不匹配。