Security 个人身份验证

Security 个人身份验证,security,public-key-encryption,Security,Public Key Encryption,我正在尝试实现双因素身份验证—您持有的令牌,您知道的密码 列出了许多昂贵的解决方案。我需要: 强加密。 如果令牌昂贵,则能够通过编程多次重置令牌上的私钥,并读取新私钥。 能够加密20个或更少字符的短字符串。我相信这意味着计算能力可能非常低。 便宜的东西。如果可能的话,我想把这些代币寄给普通消费者。 我不需要: 为了防止对令牌的物理攻击,我假设这超出了普通攻击者的技能范围。 远程杀死令牌。 存储令牌上除私钥之外的任何数据。 与时间相关的令牌,担心它们会失去同步。 我计划做以下工作: 用户将令牌插入

我正在尝试实现双因素身份验证—您持有的令牌,您知道的密码

列出了许多昂贵的解决方案。我需要:

强加密。 如果令牌昂贵,则能够通过编程多次重置令牌上的私钥,并读取新私钥。 能够加密20个或更少字符的短字符串。我相信这意味着计算能力可能非常低。 便宜的东西。如果可能的话,我想把这些代币寄给普通消费者。 我不需要:

为了防止对令牌的物理攻击,我假设这超出了普通攻击者的技能范围。 远程杀死令牌。 存储令牌上除私钥之外的任何数据。 与时间相关的令牌,担心它们会失去同步。 我计划做以下工作:

用户将令牌插入PC。 用户在键盘上输入密码。 令牌使用私钥加密密码。 应用程序通过网络发送结果。 服务器使用令牌的公钥解密密码。如果密码匹配,我会让用户进入。
我需要让普通程序员/黑客很难从令牌中读取私钥。我有什么选择?如果您认为我设置的门槛太低,您有什么建议?

服务器使用令牌的公钥解密密码

那没有道理。公钥的意义在于它可以是公开的,而不会影响系统的安全性。也许您的意思是令牌包含公钥,而服务器存储与该令牌对应的私钥

安全令牌通常不会按照您描述的方式使用。它们通常用作单点登录SSO设备。令牌生成一个与时间相关的伪随机数。在大多数情况下,生成的数字每30秒左右改变一次。服务器配置了令牌的随机种子,因此它可以生成相同的数字进行验证

编辑:根据您的评论,以下是我的新建议:

令牌或客户端应用程序上的公钥

服务器上相应的私钥

是否读取公钥无关紧要,因为了解公钥无助于猜测私钥

如有必要,按计划的时间间隔更换钥匙


如果受众是消费者,那么他们使用的计算机很可能受到某种感染-病毒/键盘记录器

如果这是一种可能性,那么整个计划将变得危险,因为使用PC键盘

抛开这些顾虑不谈: 您可以运行自己的CA并生成客户端证书-这些证书可以放在U盘的任何位置。。。应用程序可以与它们一起验证用户-只需使用密码短语作为密码等-其美妙之处在于:例如,您可以撤销证书等

另一点: 根据应用程序与服务器的通信方式,可以使用此方案进行SSL连接。。。SSL标准不仅包含通过客户端证书对服务器进行身份验证的选项,还包含通过客户端证书对客户端进行身份验证的选项

编辑:

任何便宜的东西都可以读-智能卡会更好,但它们并不便宜,PC需要额外的硬件来处理它们

安全但不便宜的选择: 如果你想要安全的东西,那么你需要一个带键盘的外部智能卡读卡器,这样就不会通过PC键盘输入任何敏感信息——但这并不便宜

另一种更便宜但仍然安全的选择:
使用手机作为第二个渠道,他们登录到你的应用程序-应用程序与服务器联系,服务器生成一些独特的和有时间限制的代码,并通过短信发送到他们的手机,他们需要输入该代码以完成登录过程

我真的不知道你到底在问什么。。。看来你没有提供足够的信息。。。例如:如果这是关于安全的,那么使用PC键盘会带来一些安全问题,比如易受键盘记录器攻击。。。此外,重置私钥可能是一个问题,这取决于私钥的实现方式。。。那么:问题到底是什么?@Yahia,我假设我们无法阻止物理访问PC的攻击者,所以我甚至没有尝试。我正在设计一款面向消费者的产品,比如VISA卡,欺诈的价格仅限于曝光。如果您能给我们一个关于此应用程序的想法,我们可能能够提供更准确的反馈。是金融应用程序的登录,还是其他什么?我理解这一点,但我不是说对PC的物理访问,而是说感染了键盘记录器恶意软件,尤其是。消费者更容易受到这些东西的攻击……在我的情况下,公钥并不是真正公开的,所以它们确实可以互换。无论如何,我已经更新了在服务器上存储私钥和在tok上存储公钥的问题
嗯,就像你建议的那样。此外,我还添加了有关目标受众的更多信息。我认为基于时间的令牌对它们来说可能太贵/太大。在这种情况下,攻击者是否读取令牌上的公钥并不重要。公钥加密的美妙之处在于,任何人都可以知道公钥,但消息只能用私钥解密。知道公钥并不能帮助您猜测私钥。不过,您应该注意的是,如果您使用的是此系统,可能根本不需要使用物理令牌。如果公钥易于读取,那么我同意物理令牌没有任何意义。我想要的不仅仅是密码。我想要令牌通过增加难度来阻止欺诈。想象一下,如果VISA没有发放实体卡,任何知道你的PIN的人都可以取款。如果是这样,那么单点登录系统运行得相当好。有没有具体的原因让你不能这么做?如果你想阻止知道密码的人访问,公钥加密对你没有帮助。我刚刚读了关于SSO系统的文章。这就是我计划要做的。您登录一次,只要令牌在驱动器中,就不必重新输入密码。您可以通过拔出令牌来注销。如果我理解正确,您的意思是我应该提示用户输入密码,生成受该密码保护的公钥,然后将其发送给用户并存储在普通U盘上。然后每次他们想登录时,他们都会输入密码,我用它来解密公钥并验证它是否有效。听起来不错,只是任何人都可以从U盘上读取公钥。这不是一个问题吗?请看我的编辑-添加了两个选项一个不是很便宜,另一个相当便宜+安全我喜欢SMS方法,但延迟太高。用户需要在插入卡后2-3秒内获得代码。根据我的经验,短信息可能需要30分钟,具体取决于您的提供商和时间。智能卡读卡器+键盘听起来太贵了,每个读卡器的价格也超过100美元。我想找到一个基于USB的安全解决方案,或者一种预测用户何时需要提前几分钟发送短信的方法。对终端用户来说,即使每天发送一次短信也很烦人。使用短信方式,不需要卡片。。。虽然如果你的延迟是30分钟左右,那肯定太高了。。。你也可以让代码在一小时或8小时内有效,或者你喜欢的任何时间。。。因此,对代码的需求可以减少即使我让代码在24小时内有效,我想用户也会觉得每天从他们可能每月只使用一次的服务中收到一条短信很烦人。其次,恐怕我不能假设100%的客户都会有手机。考虑一下我给了一张相当于医疗保险卡的东西。