我有一个.NET(c#)应用程序,它在'my'证书库中使用x509Certificate2,最初来自eToken设备。
当我使用证书(解密数据或将其用作Web请求的clientcert)时,它会要求设备PIN一次。之后,它被缓存,用户不会每隔xx分钟打扰密码请求。
现在,我有多个进程,都使用证书。 这些过程中的每一个都将请求设备PIN。 (缓存似乎是每个进程)。
有一个简单的方法吗? 我可以在某处“缓存”它,以便每个进程都可以访问令牌而无需反复请求PIN吗?
答案 0 :(得分:3)
提醒一句:进行这种“PIN”缓存是非常糟糕的安全措施。任何凭证都应尽可能短暂地存储在内存中,以避免攻击者通过监视系统内存来获取有关PIN的信息。虽然一般情况下这需要本地访问机器,但这仍然被认为是一个非常相关的威胁,因为大多数情况下,您不希望系统管理员窥探PIN:)
也就是说,对于每隔一秒输入PIN的用户来说,这是一个真正的PITA。与安全性这么多东西一样,安全性和可用性之间存在权衡。
正如您所注意到的,许多智能卡驱动程序都会自行执行此类缓存操作。通常在卡上有两个证书/密钥,一个具有不可否认密钥用法,被认为是高安全性操作,例如在文档上提供签名,另一个被认为是用于不断重复的杂务的“认证证书”。作为服务身份验证。通常,每次访问不可否认密钥时都必须重新输入PIN,而驱动程序通常会为身份验证密钥缓存PIN。
所以它真的取决于你的特定用例 - 如果你认为这个操作非常关键,我建议你不要做任何缓存。尝试“教育”用户。这是为了他们自己的利益等等。)
否则,如果您认为风险可以接受,您可以使用任何形式的进程间通信,最适合您跨进程共享PIN。一个简单的解决方案可能是在只有应用程序具有读/写权限的目录中创建“PIN文件”。每当需要PIN时检查文件是否存在(注意竞争条件!) - 如果文件尚未存在,请询问PIN并将其写入文件 - 否则只需从文件中读取PIN。确保使用用于传送PIN的零覆盖内存。