SSH键盘交互式身份验证

时间:2012-10-07 22:04:19

标签: objective-c ios authentication libssh2

我目前尝试在Objective-C中扩展libssh2 Wrapper。

我正在尝试实施libssh2_userauth_keyboard_interactive方法。我的问题是响应回调。

我在网上发现这种实现绕过了“真正的”交互性,并使用实际密码来进行身份验证:

int error = libssh2_userauth_keyboard_interactive(session, [username UTF8String], &kbdCallback);

static void kbdCallback (const char *name, int name_len, const char *instruction, int instruction_len, int num_prompts, const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts, LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses, void **abstract)
{
    responses[0].text = (char *)[password UTF8String];   // resp. (char *)[@"test" UTF8String]
    responses[0].length = strlen([password UTF8String]); // resp. (char *)[@"test" UTF8String]
}

我的一个问题是在password调用中访问实例变量static void而另一个问题是当我尝试调用该方法时我得到了SIGABRT(我使用了一个固定的字符串来测试如果有效)。

有没有可能让它工作?!

儒略

2 个答案:

答案 0 :(得分:0)

kbdCallback实际上不是一个方法,它是一个函数 - 你可以告诉它几个方面 - 它前面没有-+,返回类型周围没有括号,方法不能是static。因此,由于它是一个函数而不是一个方法,因此没有与之关联的对象,也没有self指针;因此,您无法直接获取任何实例变量。我想有几种方法可以解决这个问题;你可以拥有一个函数可以从中获取密码的对象的静态实例,或者如果有某种方法可以传递一个上下文指针以便在回调中使用,那么你就可以以这种方式传递一个对象。

关于你的SIGABRT,你能说出发生了哪一行,以及你正在使用的参数的值是什么?你的问题并不清楚。

答案 1 :(得分:0)

http://comments.gmane.org/gmane.network.ssh.libssh2.devel/4163

原因: Win32下的malloc-in-EXE-free-in-DLL。
修复:使用自定义free / malloc / realloc函数。在下面添加

static void *my_alloc(size_t count, void **abstract)            {   return malloc(count);}
static void my_free(void *ptr, void **abstract)                 {   free(ptr);}
static void *my_realloc(void *ptr, size_t count, void **abstract){  return realloc(ptr, count);}

并替换

libssh2_session_init();

libssh2_session_init_ex(my_alloc, my_free, my_realloc, NULL);