mongodb启用身份验证

支持两因素身份验证(2FA)几乎总是一个好主意,尤其是对于后台系统。 2FA有许多不同的形式,其中一些包括SMS,TOTP甚至是硬件令牌 。

启用它们需要类似的流程:

  • 用户转到其个人资料页面(如果要在注册时强制使用2fa,请跳过此页面)
  • 单击“启用双重身份验证”
  • 输入一些数据以启用特定的2FA方法(电话号码,TOTP验证码等)
  • 下次他们登录时,除了用户名和密码外,登录表单还会请求第二个因素(验证码)并将其与凭据一起发送

我将重点介绍Google Authenticator,它使用TOTP(基于时间的一次性密码)生成一系列验证码。 想法是服务器和客户端应用程序共享一个密钥。 基于该键和当前时间,两者都使用相同的代码。 当然,时钟不能完全同步,因此服务器会接受一些窗口作为有效代码。 请注意,如果您不信任Google的应用程序,则可以使用下面的相同库来实现自己的客户端应用程序(尽管您可以查看源代码以确保没有恶作剧发生)。

如何用Java(在服务器上)实现它? 使用GoogleAuth库 。 流程如下:

  • 用户转到其个人资料页面
  • 单击“启用双重身份验证”
  • 服务器生成一个秘密密钥,将其存储为用户配置文件的一部分,并将URL返回到QR码
  • 用户使用其Google Authenticator应用程序扫描QR码,从而在该应用程序中创建新的个人资料
  • 用户在与QR码一起显示的字段中输入应用程序显示的验证码,然后点击“确认”
  • 服务器在用户配置文件中将2FA标记为已启用
  • (可选)您可以为用户提供一些“便签代码”,以防他们丢失应用程序或机密信息时可以写下来。
  • 如果用户不扫描代码或不验证过程,则用户个人资料将仅包含孤立的秘密密钥,但不会被标记为已启用
  • 应该有一个选项,以后可以从其用户个人资料页面禁用2FA

从理论的角度来看,最重要的一点是共享密钥。 密码是对称的,因此双方(身份验证器应用程序和服务器)具有相同的密钥。 它通过用户扫描的QR码共享。 如果此时攻击者可以控制用户的计算机,则机密可能会泄露,从而2FA也会被攻击者滥用。 但这不在威胁模型中,换句话说,如果攻击者可以访问用户的计算机,则无论如何都已经造成了破坏。

注意:您可能会看到此过程称为2步身份验证或2因子。 “因素”是:“您知道的东西”,“您拥有的东西”和“您拥有的东西”。 您可以将TOTP视为“您知道”的另一件事,但也可以将带有安全存储的密钥的电话视为“您拥有的”东西。 在这种特殊情况下,我不坚持使用任何一种术语。

登录后,流程如下:

  • 用户输入用户名和密码,然后单击“登录”
  • 使用AJAX请求,页面询问服务器此电子邮件是否已启用2FA
  • 如果未启用2FA,只需提交用户名和密码表格
  • 如果启用了2FA,则不会提交登录表单,而是显示一个附加字段,以允许用户从身份验证器应用程序中输入验证码
  • 用户输入代码并按登录后,即可提交表单。 使用相同的登录按钮,或使用新的“验证”按钮,或使用验证输入+按钮可能是一个全新的屏幕(隐藏用户名/密码输入)。
  • 然后,服务器再次检查用户是否启用了2FA,如果是,则验证验证码。 如果匹配,则登录成功。 如果不是,则登录失败,并且允许用户重新输入凭据和验证码。 请注意,根据用户名/密码错误或代码错误,您可能会有不同的响应。 您也可以在显示验证码输入之前尝试登录。 这种方法可以说是更好的方法,因为这样您就不会向潜在的攻击者透露用户使用2FA。

我说的是用户名和密码,这可以适用于任何其他身份验证方法。 从OAuth / OpenID Connect / SAML提供程序获得成功确认之后,或者从SecureLogin获得令牌之后,您可以请求第二个因素(代码)。

在代码中,上述过程如下所示(使用Spring MVC;为了简洁起见,我将控制器和服务层合并。您可以使用将当前登录的用户详细信息提供给控制器的方式替换@AuthenticatedPrincipal位)。 假设方法在控制器中映射到“ / user /”:

@RequestMapping(value = "/init2fa", method = RequestMethod.POST)
@ResponseBody
public String initTwoFactorAuth(@AuthenticationPrincipal LoginAuthenticationToken token) {User user = getLoggedInUser(token);GoogleAuthenticatorKey googleAuthenticatorKey = googleAuthenticator.createCredentials();user.setTwoFactorAuthKey(googleAuthenticatorKey.getKey());dao.update(user);return GoogleAuthenticatorQRGenerator.getOtpAuthURL(GOOGLE_AUTH_ISSUER, email, googleAuthenticatorKey);
}@RequestMapping(value = "/confirm2fa", method = RequestMethod.POST)
@ResponseBody
public boolean confirmTwoFactorAuth(@AuthenticationPrincipal LoginAuthenticationToken token, @RequestParam("code") int code) {User user = getLoggedInUser(token);boolean result = googleAuthenticator.authorize(user.getTwoFactorAuthKey(), code);user.setTwoFactorAuthEnabled(result);dao.update(user);return result;
}@RequestMapping(value = "/disable2fa", method = RequestMethod.GET)
@ResponseBody
public void disableTwoFactorAuth(@AuthenticationPrincipal LoginAuthenticationToken token) {User user = getLoggedInUser(token);user.setTwoFactorAuthKey(null);user.setTwoFactorAuthEnabled(false);dao.update(user);
}@RequestMapping(value = "/requires2fa", method = RequestMethod.POST)
@ResponseBody
public boolean login(@RequestParam("email") String email) {// TODO consider verifying the password here in order not to reveal that a given user uses 2FAreturn userService.getUserDetailsByEmail(email).isTwoFactorAuthEnabled();
}

QR码生成使用Google的服务,从技术上讲,它也为Google提供了秘密密钥。 我怀疑它们除了生成QR码外还会存储它,但是,如果您不信任它们,则可以实现自己的QR码生成器, 那么自己生成QR码应该不难 。

在客户端,它是对上述方法的简单AJAX请求(旁注:我觉得AJAX一词不再流行,但我不知道如何称呼它们。是异步的还是背景的Javascript?)。

$("#two-fa-init").click(function() {$.post("/user/init2fa", function(qrImage) {$("#two-fa-verification").show();$("#two-fa-qr").prepend($('<img>',{id:'qr',src:qrImage}));$("#two-fa-init").hide();});
});$("#two-fa-confirm").click(function() {var verificationCode = $("#verificationCode").val().replace(/ /g,'')$.post("/user/confirm2fa?code=" + verificationCode, function() {$("#two-fa-verification").hide();$("#two-fa-qr").hide();$.notify("Successfully enabled two-factor authentication", "success");$("#two-fa-message").html("Successfully enabled");});
});$("#two-fa-disable").click(function() {$.post("/user/disable2fa", function(qrImage) {window.location.reload();});
});

登录表单代码在很大程度上取决于您正在使用的现有登录表单,但是重点是使用电子邮件(和密码)调用/ requires2fa以检查是否启用了2FA,然后显示验证码输入。

总体而言,两因素身份验证的实现很简单,我建议在大多数系统中使用它,因为安全性比简单的用户体验更为重要。

翻译自: https://www.javacodegeeks.com/2017/10/enabling-two-factor-authentication-web-application.html

mongodb启用身份验证

mongodb启用身份验证_为您的Web应用程序启用两因素身份验证相关推荐

  1. 为您的Web应用程序启用两因素身份验证

    支持两因素身份验证(2FA)几乎总是一个好主意,尤其是对于后台系统. 2FA有许多不同的形式,其中一些包括SMS,TOTP甚至是硬件令牌 . 启用它们需要类似的流程: 用户转到其个人资料页面(如果要在 ...

  2. 如何使用Google Authenticator在ASP.NET Core中设置两因素身份验证

    介绍 (Introduction) In this article, we are going to learn how to perform two-factor authentication in ...

  3. laravel集成谷歌验证_如何将Google的两因素身份验证添加到Laravel

    laravel集成谷歌验证 Laravel is a wonderful PHP framework that makes building applications with PHP a lot o ...

  4. 如何在Raspberry Pi上设置两因素身份验证

    Kiklas/ShutterstockKiklas /快门 The Raspberry Pi is everywhere now, which is why it's caught the eye o ...

  5. 火狐和chrome_Firefox,Chrome和Edge都将支持WebAuthn的硬件两因素身份验证

    火狐和chrome Logging into Gmail or Facebook could soon mean plugging in a USB device, potentially makin ...

  6. 两因素身份验证增强您的Spring Security

    通过要求用户提供第二种身份验证,双重身份验证为您的Web应用程序增加了一层额外的安全保护. 常见的第二个因素包括: 验证码生物识别电子邮件或短信代码 让我们探讨如何利用Nexmo向现有的Web应用程序 ...

  7. 亚马逊一直停留在身份验证_如何为您的Amazon帐户启用两因素身份验证

    亚马逊一直停留在身份验证 Two-Factor Authentication (2FA) is a great security tool, and we always recommend it. M ...

  8. facebook换手机验证_Facebook升级了两因素身份验证:这是设置方法

    facebook换手机验证 Facebook has had two-factor authentication for a long time, but it used to be called L ...

  9. hosts多个ip对应一个主机名_一个简单的Web应用程序,用作连接到ssh服务器的ssh客户端...

    WebSSH 一个简单的Web应用程序,用作连接到ssh服务器的ssh客户端.它是用Python编写的,基于tornado,paramiko和xterm.js. 特征 支持SSH密码验证,包括空密码. ...

最新文章

  1. 环境监控告警系统之TIM即时消息推送部署
  2. java 时钟 算法分析_java实现时钟方法汇总
  3. 水晶报表之创建子报表
  4. asp.net学习之GridView
  5. .NET基础知识(一)
  6. 一、Java多线程基础
  7. 《金字塔原理》要点汇总
  8. Extjs的grid总计实现
  9. 基于MDK1808-EK_T70开发板的miniGUI应用程序演示03: ads1110热电偶温度传感器
  10. Flink SQL Size of the state is larger than the maximum permitted memory-backed state
  11. 使用Java化简逻辑表达式
  12. 如果宁静是Oracle,那万茜,张雨绮,黄圣依 是什么?(附姐姐信息表)
  13. 朱广权迎手语新搭档?百度智能云AI手语主播正式上岗
  14. 用qt合并ts视频文件
  15. java版林地府邸种子_最好玩的5大林地府邸种子,手机党玩家的福利!
  16. Fuz OJ 2116 买糖果
  17. URL 重写使用步骤
  18. 太赫兹在医学诊断方面的应用
  19. 新消费浪潮中,如何构建私域体系
  20. You-get 使用

热门文章

  1. 洛谷P2680:运输计划(倍增、二分、树上差分)
  2. CF5E-Bindian Signalizing【单调栈】
  3. AT3957-[AGC023F]01 on Tree【贪心,堆】
  4. P3959-宝藏【模拟退火】
  5. GYM101002C - Greetings!
  6. Sentinel(十四)之控制台
  7. JfreeChart(八)之甘特图
  8. 最长回文子串(Longest Palindromic Substring)
  9. 阿里巴巴开源 Spring Cloud Alibaba,加码微服务生态建设
  10. HashMap 和 HashTable 到底哪不同 ?