不,标题中没有缺少空格。 这与安全登录无关 ,而与安全顾问Egor Homakov开发的SecureLogin协议有关,该协议因在没有权限的情况下致力于掌握 Rails项目而闻名 。

SecureLogin协议非常有趣,因为它不依赖任何中央方(例如,Facebook和Twitter之类的OAuth提供程序),从而避免了OAuth的所有陷阱(霍马科夫经常批评)。 它也不是密码管理器。 它只是一个客户端软件,执行一些加密操作,以便向服务器证明它确实是正确的用户。 为此,关键在于两个部分:

  • 使用主密码生成私钥。 它使用密钥派生函数,该函数可确保产生的私钥具有足够的熵。 这样,使用相同的主密码和相同的电子邮件,您每次使用密码都会获得相同的私钥,因此也将获得相同的公钥。 您是唯一可以通过使用私钥签名消息来证明此公钥就是您的公钥的人。
  • 服务提供商(网站)通过在注册时将其存储在数据库中,然后在每次后续登录时进行查找来通过公钥来识别您

客户端部分最好由本机客户端执行-浏览器插件(Chrome浏览器可用)或特定于操作系统的应用程序(包括移动应用程序)。 这听起来可能很乏味,但实际上它既快速又容易,并且是一次性事件(并且比密码管理器容易)。

我必须承认–我喜欢它,因为一段时间以来我一直有一个类似的想法。 在我的“生物特征识别”演示文稿中 (我在这里讨论了使用仅生物特征识别方案的陷阱),我提出了(幻灯片23)一种使用生物特征(例如用手机扫描)+密码生成私钥的识别方案(使用键衍生功能)。 而且将来可以轻松将生物特征添加到SecureLogin。

当然,这还不是全部,因为一个问题尚未完全解决-撤销。 万一有人窃取了您的主密码(或者您怀疑它可能被盗了),您可能需要更改它,并将更改通知所有服务提供商,以便他们可以用新的旧密钥替换您的旧公共密钥。 这有两个含义-首先,您可能没有完整的注册站点列表,并且由于您可能已更改设备或使用了多个设备,因此有些网站可能永远都不知道您的密码更改。 存在提议的解决方案(第3点和第4点 ),但是它们不是协议固有的,而是依赖于集中式服务。 第二个问题是–如果攻击者首先更改您的密码该怎么办? 为避免这种情况,服务提供商可能应该依赖电子邮件验证,该电子邮件验证既不是协议的一部分,也不鼓励它。 但是,无论如何,您可能都必须这样做,以确保安全。

Homakov不仅定义了协议,还提供了本机客户端的实现,以便任何人都可以开始使用它。 因此,我决定将其添加到当前正在处理的项目中 ( 登录页面在此处 )。 为此,我需要服务器验证的Java实现,并且由于不存在这种实现(目前仅提供ruby和node.js), 因此我自己实现了它 。 因此,如果要在Java Web应用程序中使用SecureLogin,则可以使用它而不是自己开发。 在实现它的过程中,我遇到了一些可能导致协议更改的小问题,因此我认为向后兼容性也应该以某种方式包含在协议中(通过版本控制)。

那么,代码看起来如何? 在客户端,您有一个按钮和一些JavaScript:

<!-- get the latest sdk.js from the GitHub repo of secureloginor include it from https://securelogin.pw/sdk.js -->
<script src="js/securelogin/sdk.js"></script>
....
<p class="slbutton" id="securelogin">⚡ SecureLogin</p>
$("#securelogin").click(function() {SecureLogin(function(sltoken){// TODO: consider adding csrf protection as in the demo applications// Note - pass as request body, not as param, as the token relies // on url-encoding which some frameworks mess with$.post('/app/user/securelogin', sltoken, function(result) {if(result == 'ok') {window.location = "/app/";} else {$.notify("Login failed, try again later", "error");}});});return false;
});

单个按钮既可以用于登录也可以用于注册,或者,如果必须包含其他详细信息而不只是电子邮件,则可以使用单独的注册表单。 由于除了基于密码的登录名之外还添加了SecureLogin,因此保留了这两种形式。

在服务器上,您只需执行以下操作:

@RequestMapping(value = "/securelogin/register", method = RequestMethod.POST)
@ResponseBody
public String secureloginRegister(@RequestBody String token, HttpServletResponse response) {try {SecureLogin login = SecureLogin.verify(request.getSecureLoginToken(), Options.create(websiteRootUrl));UserDetails details = userService.getUserDetailsByEmail(login.getEmail());if (details == null || !login.getRawPublicKey().equals(details.getSecureLoginPublicKey())) {return "failure";}// sets the proper cookies to the responseTokenAuthenticationService.addAuthentication(response, login.getEmail(), secure));return "ok";} catch (SecureLoginVerificationException e) {return "failure";}
}

这是spring-mvc,但可以是任何Web框架。 您也可以以某种方式将其合并到spring-security流程中。 我从不喜欢spring-security的复杂性,所以我手动完成了。 另外,您可以返回正确的状态代码,而不是字符串。 请注意,我正在通过电子邮件进行查找,然后才检查公共密钥(就像它是密码一样)。 如果在公钥列上有正确的索引,则可以采取其他方法。

我不建议您使用仅限SecureLogin的系统,因为该项目仍处于初期阶段,用户可能对此不太满意。 但是,当然,将其作为选项添加是个好主意。

翻译自: https://www.javacodegeeks.com/2017/09/securelogin-java-web-applications.html

Java Web应用程序的SecureLogin相关推荐

  1. 在Tomcat中部署Java Web应用程序几种方式

    在Tomcat中部署Java Web应用程序有两种方式:静态部署和动态部署.在下文中$CATALINA_HOME指的是Tomcat根目录.  一.静态部署       静态部署指的是我们在服务器启动之 ...

  2. java web里实现 mvc_MVC模式在Java Web应用程序中的实现

    一.MVC简介: MVC架构是一个复杂的架构,其实现也显得非常复杂..Views可以看作一棵树,可以用Composite Pattern来实现.Views和Models之间的关系可以Observer  ...

  3. MVC模式 在Java Web应用程序中的实现

    一.MVC简介 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分 ...

  4. Java Web应用程序:Oozie及其使用方式

     http://tech.it168.com/a2011/0818/1234/000001234580.shtml 什么是Oozie? Oozie是一种Java Web应用程序,它运行在Java ...

  5. java web源代码_检测Java Web应用程序而无需修改其源代码

    java web源代码 与其他系统进行交互时,大多数Java Web应用程序都使用标准Java接口. 诸如Web页面或REST服务器之类的基于HTTP的服务是使用接口javax.servlet.Ser ...

  6. 使用Hibernate和Spring构建Java Web应用程序

    这篇文章将展示如何在Spring环境中使用带有Hibernate ORM的MYSQL DB创建学生注册应用程序. 这是一个简单的应用程序,旨在在注册过程中从用户收集输入详细信息,将这些详细信息保存在M ...

  7. 检测Java Web应用程序而无需修改其源代码

    与其他系统进行交互时,大多数Java Web应用程序都使用标准Java接口. 使用接口javax.servlet.Servlet来实现基于HTTP的服务,例如网页或REST服务器. 使用JDBC接口j ...

  8. cometd_CometD:Java Web应用程序的Facebook类似聊天

    cometd 聊天就像吃一块蛋糕或喝一杯热咖啡一样容易. 您是否曾经考虑过自己开发聊天程序? 您知道,聊天不容易. 但是,如果您是开发人员,并且阅读了本文的最后部分,则可以尝试自行开发一个聊天应用程序 ...

  9. web csrf java_在Java Web应用程序中阻止CSRF

    web csrf java 跨站点请求伪造攻击(CSRF)在Web应用程序中非常常见,如果允许,可能会造成重大危害. 如果您从未听说过CSRF,建议您查看有关它的OWASP页面 . 幸运的是,阻止CS ...

最新文章

  1. 趣学python3(45)--调用C库-加解密
  2. 深圳.NET俱乐部 Windows 7 社区发布会总结及资源下载
  3. linux 添加最大串口数量方法
  4. Less语法基于node\grunt/gulp编译
  5. css怎么使元素绝对定位有过度效果_CSS定位属性Position实例分析
  6. jieba分词_Jieba.el – 在Emacs中使用jieba中文分词
  7. [转载]MySQL开发中常用的查询语句总结
  8. 云设置下如何满足客户的数据安全需求?
  9. 求连续数组子序咧的最大和
  10. 浅析Linux下的task_struct结构体
  11. 【ZOJ 4097 The 19th Zhejiang University Programming Contest H】Rescue the Princess【边双连通缩点+LCA】
  12. w7系统您的计算机无法启动,Windows7旗舰版启动不了怎么办?电脑无法正常启动Windows7解决方法...
  13. android 模拟器后缀名,apk是什么文件?apk文件模拟器是什么?
  14. 原生JS零魂之问(上)学习笔记‍
  15. 华为手机不小心点了始终_华为手机有一个设置,用过一次就再也离不开了,你打开了吗?...
  16. python小游戏 仿谷歌浏览器小恐龙小游戏设计与实现
  17. vue项目各个文件的作用
  18. win10 10074版本qq显示问题
  19. 车联网上云最佳实践学习笔记
  20. 南邮CG-CTF—杂项Misc writeup

热门文章

  1. Oracle入门(十三B)之高级查询(上)
  2. Java Jar包的压缩、解压使用指南
  3. 为什么总是喜欢看我桌面呢?
  4. 《四世同堂》金句摘抄(十七)
  5. 数据库的嵌套查询和统计查询
  6. 插值查找+代码实现+注意事项
  7. java synchronized 使用_Java中synchronized的使用实例
  8. docker 安装redis 挂载到宿主机
  9. windows监控txt写入_Windows的bug们
  10. session实现购物车