Java Web应用程序的SecureLogin

不,标题中没有缺少空格。 这与安全登录无关 ,而与安全顾问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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351132.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最通俗的CRC校验原理剖析

以下内容摘自笔者即将出版的最新著作《深入理解计算机网络》一书。本书将于12月底出版上市&#xff0c;敬请留意&#xff01;&#xff01; 本书原始目录参见此文&#xff1a;http://winda.blog.51cto.com/55153/1063878 5.3.2 循环冗余校验检错方案 上节介绍的奇偶校验码&#…

SpringMVC 上传文件and过滤器

SpringMVC提供了一个MultipartResolver接口用来实现文件上传&#xff0c;并使用Commons FileUpload技术实现了一个该接口的实现类CommonsMultipartResolver。如果要在SpringMVC中实现文件上传功能&#xff0c;就可以在springmvc.xml中配置MultipartResolver接口的实现类。 以下…

guava 集合转换_Guava的Collections2:过滤和转换Java集合

guava 集合转换Groovy的便利之一是能够通过Groovy的闭包支持轻松地对集合执行过滤和转换操作。 Guava将对集合的过滤和转换引入标准Java&#xff0c;这是本文的主题。 Guava的Collections2类具有两个公共方法&#xff0c;这两个方法都是静态的。 方法filter&#xff08;Collec…

CRC校验算法的解析,暨对网上的CRC详解的补充

一、CRC的形象理解 本文面向对CRC校验有一定基础的读者&#xff0c;如果你不懂&#xff0c;请戳这里。维基百科还有图解版的。 在CRC的具体实现中&#xff0c;如果要计算CRC的数据很长&#xff0c;一般都会用到寄存器&#xff0c;用来保存当前的计算到的CRC&#xff0c;循环计算…

7.5 GRASP原则五:高内聚 High Cohesion

GRASP原则五&#xff1a;高内聚 High Cohesion   How to keep objects focused, understandable and manageable, and as a side effect support Low Coupling? 如何使对象功能专注、可理解、可管理&#xff0c;同时又支持 低耦合&#xff1f;5.1 GRASP rule 5&#xff1…

资源泄漏:救援的命令模式

多年来&#xff0c; 使用Plumbr进行性能监视时&#xff0c;我遇到了数百个资源泄漏引起的性能问题。 在这篇文章中&#xff0c;我想描述一种最简单的方法来清理资源并避免该问题。 首先&#xff0c;我以电影播放器​​应用程序为例来描述问题。 这种应用程序的主要功能自然是在…

Word文字的三种隐藏方法

在Word的使用过程中&#xff0c;有时候可能需要这么一种情况&#xff1a;一些文字或者段落我们暂时不需要&#xff0c;但又不知后期是否用到&#xff0c;其碍眼却又不能删除。这个时候&#xff0c;最好的方法就是暂时隐藏文字或者段落。今天寻老师教大家三种隐藏Word文本的方法…

Video 对象方法 canPlayType()

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <p>我的浏览器可以播放 MP4 视频吗?<span> <button οnclick"supportType(e…

Linux下区分物理CPU、逻辑CPU和CPU核数

㈠ 概念 ① 物理CPU 实际Server中插槽上的CPU个数 物理cpu数量&#xff0c;可以数不重复的 physical id 有几个 ② 逻辑CPU Linux用户对 /proc/cpu…

java原子更新类_Java内部具有原子更新的动态热交换环境

java原子更新类有人可能会争辩说上述标题可以简称为OSGi &#xff0c;我想在一开始就放弃这种思考过程。 对于OSGi而言&#xff0c;这没有什么冒犯的&#xff0c;它是一个很棒的规范&#xff0c;在实现层或可用性层上都搞砸了&#xff0c;这就是我对OSGi的信念。 当然&#xf…

5个构建Spring Boot API的实用技巧

建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; 每个API开发人员都在寻找一种更安全…

C++项目目录组织结构

项目目录结构的问题基本上是个仁者见仁&#xff0c;智者见智的问题&#xff0c;只要自己用着顺手&#xff0c;使用什么样的目录组织结构是没有什么大碍的。当然如果项目很大&#xff0c;参与的人员很多&#xff0c;那么合理的组织一下目录结构还是会有很大的益处的。不同类型的…

火绒杀毒软件更安静

https://www.huorong.cn/转载于:https://www.cnblogs.com/Tom-yi/p/10554564.html

完全编译安装boost

文章目录 1. 安装依赖2. 编译安装 boost3. 环境变量配置 boost是C世界中相当优秀的第三方库&#xff0c;被选入STL的也有不少&#xff0c;其中用到的C奇技淫巧更是数不胜数。 安装依赖 boost 在类 Unix 系统上的安装&#xff0c;可以参考官方文档的 Get Started&#xff0c;除此…

c#Md5 32位加密结果少了两个0的原因

我们的&#xff1a; e1adc3949ba59abbe56e57f20f883e 第三方的&#xff1a;e10adc3949ba59abbe56e057f20f883e 原因: 这个是很常见的错误&#xff0c;你字节转换成字符串的时候要保证是2位宽度啊&#xff0c;某个字节为0转换成字符串的时候必须是00的&#xff0c;否则就会丢失…

lambdas for_Wordcounter,使用Lambdas和Fork / Join计算Java中的单词数

lambdas for这些天来&#xff0c;我发布了Wordcounter &#xff0c;这是一个Java库和命令行实用程序&#xff0c;用于对文本文件中的单词进行计数并对单词计数进行分析&#xff0c;从而大量使用了功能编程结构和并行计算方法。 这是我在“令人讨厌的快速问答”大赛第四个条目SA…

Bitmap Font生成

工具&#xff1a;AngelCode 的 Bitmap Font Generator。把需要用到的文字写到一个txt&#xff0c;注意编码为Unicode。接着&#xff0c;在工具里 Edit->select chars from file选择刚才新建的txt文件。然后。。。之后的没啥细节&#xff0c;随意搞吧。转载于:https://www.cn…

分隔和截断字符串, boost string algorithm library中的split和trim

http://www.boost.org/doc/libs/1_46_1/doc/html/string_algo.html 这个库是个 headers only library  这个库提供了STL没有提供的 string-related算法, 但是实现做到了可以用在任何 character 的 container上 split 在写在线状态的改造时候要把一个字符串中描述的几种类型拆…

使用Spring Integration重试RabbitMQ

我最近阅读了有关使用RabbitMQ重试的方法 在这里&#xff0c;并想尝试类似的方法 Spring Integration &#xff0c;提供了一组很棒的集成抽象。 TL; DR解决的问题是重试一次消息&#xff08;在处理失败的情况下&#xff09;&#xff0c;两次重试之间有较大的延迟&#xff08…

Vue_(Router路由)-vue-router路由的基本用法

vue-router官网&#xff1a;传送门 vue-router起步&#xff1a;传送门 vue-router路由&#xff1a;Vue.js官网推出的路由管理器&#xff0c;方便的构建单页应用 单页应用&#xff1a;Single Page Application简称SPA&#xff0c;只有一个web页面的应用&#xff0c;用户与应用交…