在 Windows 应用商店应用中读取 HID 代理卡

Posted

技术标签:

【中文标题】在 Windows 应用商店应用中读取 HID 代理卡【英文标题】:Reading HID proxy card in Windows Store app 【发布时间】:2013-12-22 09:42:58 【问题描述】:

我正在尝试基于用户的 HID 卡值对用户进行身份验证的 PoC。我没有任何特定的 API 供读者使用。读卡器通过键盘仿真输出卡的明码。

PoC 允许用户通过用户名/密码或通过 HID 代理卡进行身份验证。为了简化事情,我想使用隐藏的TextBox 来读取来自 HID 的值,并从TextChanged 事件触发相应的 Web 服务。

我无法这样做。谁能建议如何做到这一点,我对.Net环境很陌生。

【问题讨论】:

“HID卡值”是指序列号吗?或者你的意思是通过像 YubiKey 这样的东西?如果它是 YubiKey 之类的东西,直接通过键盘输入键,所以你应该只需要挂钩到核心窗口的 KeyDown 事件(或 KeyUp),然后解析所有值。 @NateDiamond HID 卡值是指存储在卡中的任何识别信息。我想知道我是否可以保留一个隐藏的 TextBox 并将 card 的值填充到它。 能否提供阅读器设备的名称和制造商? @MichaelRoland 卡片是HID 1386 ISOProx II Card,读者是RFIdeas pcProx 【参考方案1】:

使用该版本的阅读器设备(具有键盘仿真功能的设备),您将需要某种形式的文本输入控件(例如 TextBox)来捕获虚拟键盘发送的文本。您使用隐藏文本框的方法的问题在于,当虚拟键盘“键入”卡 ID 时,它不会获得焦点。

因此,当您期望卡片 ID 时,您需要在任何具有焦点的 UI 元素中拦截 KeyDown 事件。例如,如果您有一个窗口并且没有 TextBox(或其他使用 KeyPress 事件的元素)具有焦点,您可以尝试在窗口级别拦截 KeyPress 事件:

<Window ...
    KeyDown="onKeyDownHandler"
>

相应的处理程序方法如下所示:

private void onKeyDownHandler(object sender, KeyEventArgs e) 
    // e.Key will give you the pressed key

因此,使用此处理程序,您应该能够收集 RFID 阅读器发送的所有虚拟按键。所以你需要做的就是收集它们并将它们翻译成字符。


更新:

这个product leaflet建议可以配置读卡器的虚拟键盘版本,在卡ID前后添加击键。因此,即使焦点位于用户名或密码的文本输入字段上,您也可以通过在卡 ID 之前添加用户名/密码中不能出现的字符/控制键码来检测并屏蔽从该 RFID 阅读器发送的输入.然后,您可以在两个文本框中拦截 KeyDown 事件,并且在接收到该控制键码后,您可以使用虚拟键盘发送的所有击键。通过用e.Handled = true; 标记这些击键,您应该能够将它们从文本框中隐藏起来。

作为替代方案,您可以使用该阅读器的串行版本(例如 USB 虚拟 COM 端口)。如果这是一个选项...然后您可以通过串行连接而不是虚拟键盘接收卡 ID。因此,您可以轻松区分用户输入和 RFID 阅读器输入,因为两者都将到达不同的通信接口。

【讨论】:

感谢您的回答。尝试您的建议后,我会更新。登录页面有一个用户名/密码TextBox。即使它们中的任何一个有焦点,也不希望在扫描时显示卡片中的字符。理想情况下,我想创建一个可以启动/停止的 CardReader 侦听器,以及一个在扫描卡后提供卡值的回调。 在这种情况下,您可能需要考虑使用该阅读器的其他版本(该阅读器不能用作虚拟键盘,而是使用(虚拟)COM 端口)。使用虚拟键盘类型阅读器,您无法真正区分手动输入的用户名/密码和虚拟输入的卡 ID,因此您需要让用户切换到一个单独的屏幕来监听卡 ID。 唯一的麻烦是他必须为它创建一个自定义驱动程序(假设制造商不提供使用WinUSB.sys的根认证、签名驱动程序)。不过看起来他们确实有一个串行版本,所以这绝对可以工作。 对,该阅读器的其他版本使用虚拟串行 (COM) 端口,因此无需定制驱动程序。 我的一位前同事成功地为 Windows 7 做了一个相同的 PoC。通过使用反射,我可以看出他使用了基于 C 的 pcProxAPI.dll 并将其包装为类库。尝试做同样的事情。

以上是关于在 Windows 应用商店应用中读取 HID 代理卡的主要内容,如果未能解决你的问题,请参考以下文章

Swift 应用商店截图制作工具 AppScreenshots

如何开发windows下的USB HID应用

从 Windows 应用商店应用程序访问本地文件夹?

使用 hid.dll API 从 HID 设备读取制造商字符串时遇到问题

如何从Windows 7中的非HID设备捕获USB中断?

如何从 USB HID 设备读取输入?