问题标签 [srp-protocol]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1793 浏览

authentication - Spring Security - 安全远程密码协议 - SRP - 身份验证提供程序

当问这个问题时,我正在寻找实现我自己的 AuthenticationProvider 的指导。我的意思是:

到目前为止,我已经了解到 Spring Security 会询问 AuthenticationProvider 对象是否用户已通过身份验证。目前我正在使用 DaoAuthenticationProvider 来处理我自己的客户 UserDetailService 返回的用户名和密码。一切都很好!Spring 支持许多不同的 AuthenticationProvider,例如有一个用于 LDAP、Jdbc、DAO(如上所述),我什至能够找到一个用于 Kerberos。但是 SRP 没有身份验证提供程序,因此需要编写一个。

我的问题如下:

当我们使用 DaoAuthenticationProvider 即用户/密码身份验证时,我们有一个 html 表单,其中输入了用户名和密码,然后一个按钮负责提交这两个参数。购买的参数通过某些传输通道传输到服务器,即只需单击一下,我们就可以在同一个 http 请求中发送所有数据,即身份验证所需的所有数据。这可以在 UsernamePasswordAuthenticationFilter 中看到。这里“attemptAuthentication”方法采用“HttpServletRequest request”,其中包括用户名和密码。到现在一切都好。

好吧,在简单的 SRP 中,我们还有一个包含用户名和密码的表单,除了密码!!!必须!!!不能通过网络传输。为了实现该约束,必须在客户端和服务器之间进行“讨论”,即必须交换以下参数。

1) 用户名​​ (I),

2) 一个名为“A”的值

3) 一个名为“B”的值

4) 一个名为“M1”的值

5) 一个名为“M2”的值

好吧,让我们假设有一个名为“SrpAuthenticationProcessingFilter”的过滤器,如果新的身份验证协议更像是来自 RFC 5054 的对话,那么过滤器应该是什么样子。

在这里,我们有一个客户需要

  • a) 首先发送他的用户名 (I)
  • b) 然后服务器需要以值 B 响应。(在这种情况下,N,g,s 并不是真正需要的)
  • c)客户端发送它的“值A”
  • d) 客户端使用来自服务器的值 B 并基于该值计算密钥。
  • e) 服务器也根据值 A 计算密钥。
  • f) 客户端向服务器发送值 M1。
  • g) 服务器获取 M1 值并基于以 M1 值作为参数的公式,他能够验证密钥是否匹配,如果计算出的购买方的密钥匹配,则用户通过身份验证,并且产品即共享密钥可以进一步用于其他处理。

与用户名和密码验证相比,这些是 7 个步骤而不是一个步骤。其中 3 个需要在 SrpAuthenticationProcessingFilter 之前发生。现在我知道有可能将用户名与“值 A”一起发送,从而缩短步骤数,但我想严格遵守 RFC。永远不要走简单的路,对吧?

问题实际上是我在哪里放置负责客户端和服务器之间的乒乓(对话)的代码,即上面提到的前 3 个步骤 a、b 和 c。它应该将它们放在 SrpEntryPoint 对象中还是其他地方。if else 那么是在 SpringSecurity 的上下文中吗?

我可以解决这个问题的一种方法是使用 websockets,但我也想让该身份验证独立于任何第 5-7 层协议,例如 websockets、http、spdy 等。这意味着第一个实现应该是通过简单的 http 请求/响应,然后使用任何其他协议。

因此,目前实施 SRP 的正确结构是:

  • SRPAuthenticationEntryPoint 实现 org.springframework.security.web.AuthenticationEntryPoint - 这基本上说明了如果对受保护资源的请求进入但用户尚未经过身份验证应该做什么。在这里,我们可以在资源尚未经过身份验证的情况下进行重定向。也许这也是负责步骤 a、b、c 的地方,不确定这是否是正确的地方。请求指导和信息!

  • SrpAuthenticationProcessingFilter 扩展了 GenericFilterBean。SrpAuthenticationProcessingFilter 的存在是为了进行部分验证,例如检查 srp 参数是否接收到正确的并对应于服务器设置的 srp 参数。在这里重要的是要提到 SrpAuthenticationProcessingFilter 没有进行任何用户名验证,即需要在调用 SrpAuthenticationProcessingFilter 之前的一步中进行,可能是 SrpEntryPoint 或我不知道如何调用它的其他步骤。SrpAuthenticationProcessingFilter 有一个方法“doFilter”,其中正在创建第二个结构,即 SrpAuthenticationToken。

  • SrpAuthenticationToken 扩展 org.springframework.security.authentication.AbstractAuthenticationToken。在我的理解中,该令牌与 DAO 对象类似,该令牌映射成功身份验证所需的所有字段。当部分验证的参数被填充到 SrpAuthenticationToken 中时,SrpAuthenticationToken 被传递给 org.springframework.security.authentication.AuthenticationManager 接口的authenticat方法,即类似的东西

    myAuthentication = authenticationManager.authenticate(SrpAuthenticationToken);

根据 Spring Security 配置中配置的身份验证提供程序,在我们的案例中调用 SrpAuthentication 提供程序,即:

  • SRPAuthenticationProvider - 实现 org.springframework.security.authentication.AuthenticationProvider。在这里,步骤 d、e、f 和 g 正在被验证和比较。如果发生错误,则抛出新的 BadCredentialsException("Invalid username/password/Verifiere") 异常。

  • SrpSessionValidator - 这个只负责验证 Srp 会话的特定参数,并且会从 SrpAuthenticationProcessingFilter 以及在 SrpAuthenticationProcessingFilter 之前的一步中调用,以验证用户名是否存在于数据库中。

我只知道如何实现 Srp 身份验证,因此如果这完全有意义并且 SRPAuthenticationEntryPoint 是步骤 a、b 和 c 的正确位置,我想要一些评论。我觉得这不是正确的地方。

非常感谢任何反馈。

问候,

铁托

Addition1(2014 年 11 月 21 日)-> 作为对“在哪里放置负责客户端和服务器之间的 ping pong(对话)的代码,即前 3 个步骤 a、b 和 c”的问题的回答这很可能是一个标准(我称之为协商)过滤器,它将承担这项工作。

现在我想重新表述这个问题,即在身份验证完成之前以及在接收到 M1 和 M2 消息之前,即步骤 1、2 和 3。我应该把那个对象放在哪里?即它应该是一个对象应该存在的地方,例如 60 秒,然后在没有收到 M1 和 M2 消息的情况下自动删除。我的意思是“SecurityContextHolder”对象之前的某个对象。我只是不知道与弹簧安全相关的对象/上下文的名称是什么,我也不知道这种结构是否存在?

0 投票
1 回答
750 浏览

session - SRP 会话密钥的示例用法

我正在为游戏编写我的第一个登录系统。决定 SRP 并成功实施了该交互。客户端和服务器现在具有相同的会话密钥。我该如何使用它们?

关于它的所有信息都说它可以用于加密通信,但我还没有找到说明如何使用的信息。

SRP 在身份验证过程中交换会话密钥。此密钥可用于加密用户的登录会话...

http://srp.stanford.edu/advantages.html

已建立的会话密钥“S”可用于加密客户端和服务器之间的进一步通信。

http://connect2id.com/products/nimbus-srp

这里有什么选择,什么是好的选择?AES?

谢谢!

0 投票
0 回答
646 浏览

ssl - nginx 是否支持 SSL-SRP?

nginx 是否支持 SRP(安全远程密码)协议?

我看到 ssl_ciphers 指令接受 OpenSSL 使用的格式,但不清楚 nginx 是否真的支持 OpenSSL 支持的所有密码。

我没有看到 SRP 的 nginx 文档(例如,如何指定验证程序文件),这是否意味着 nginx 不支持 SRP?

谢谢, 艾丽莎

0 投票
1 回答
2190 浏览

arrays - 为什么在散列之前在 java 字节数组中删除前导全零字节

这个问题是关于在java中对字节数组进行散列之前对它们进行的操作。

我试图理解为什么在多个 srp 加密库中,前导零字节(如果有的话)在被散列之前被丢弃。

例如:这是来自充气城堡

或者这是来自 nimbus SRP:

购买的示例基本上放弃了前导零。这些库中的方法称为“toUnsignedByteArray”,尽管我不明白为什么删除前导零会使字节数组无符号。即它只丢弃零字节,然后下一个字节可能为负,即下一个字节成为最左边的字节(在 Big Indian 中),字节中最左边的位是符号位,可以根据字节设置或取消设置,因此,如果我正确理解字节数组的结构,那么首先不应将这些方法调用为“toUnsignedByteArray”。然而最重要的问题是为什么我们需要删除那个零字节以防它全为零

这是来自 srp rfc 5054 附录 A 的测试向量示例。我们从 A 和 B 计算 U。其中 B 的零字节恰好是二进制中的全零,即如果我们将 B 打印为字节数组,我们将得到以下值

[0, -67, 12, 97, 81, 44, 105, 44, 12, -74, -48, 65, -6, 1, -69, 21, 45, 73, 22, -95, -25, 122, -12, 106, -31, 5, 57, 48, 17, -70, -13, -119, 100, -36, 70, -96, 103, 13, -47, 37, -71, 90 , -104, 22, 82, 35, 111, -103, -39, -74, -127, -53, -8, 120, 55, -20, -103, 108, 109, -96, 68, 83 , 114, -122, 16, -48, -58, -35, -75, -117, 49, -120, -123, -41, -40, 44, 127, -115, -21, 117, - 50、123、-44、-5、-86、55、8、-98、111、-100、96、89、-13、-120、-125、-114、122、0、3、11、51 , 30, -73, 104, 64, -111, 4, 64, -79, -78, 122, -82, -82, -21, 64, 18, -73, -41, 102, 82, 56, -88, -29, -5, 0, 75, 17, 123, 88]

字节零以二进制打印:00000000

现在我明白出于某种原因删除该字节很重要(尽管我不确定)我的意思是因为这些测试向量使用这两个库正确计算它应该正确编程吗?但是我不明白为什么我们需要删除前导零字节。它有什么问题。如果我删除该前导 zeor 字节并尝试从没有前导零字节的字节数组中创建另一个 BigInteger,那么在这种情况下我将得到一个完全不同的数字,甚至是负数。所以删除那个零字节对我来说没有任何意义。欢迎任何解释。

0 投票
2 回答
370 浏览

security - 关于SRP算法的问题

我尝试使用 SRP 算法,但我有一些问题:

  1. 使用 SSL/TLS 进行注册和授权 SRP 算法是一个不错的选择吗?对于仅使用 SSL/TLS 的所有其他传输?我将使用 C# Sockets 来实现。

  2. 如何生成g、k、N?使用这些类似应用程序常量是否安全?

  3. SRP算法对吗?

    //M-modulus,g-generator,k-multiplier,I-username,p-password,s-salt,v-pass verifier

    登记:

    客户端: s = randomString(); x = 哈希(s, p); v = g^x %N;

    sendToServer(I, s, v);

    服务器: save(I, s, v);

    授权:

    客户端: a = random(); A = g^a %N;

    sendToServer(I, A);

    服务器:if(A != 0) { b=random(); B = k*v + g^b %N;}

    sendToClient(B, s);

    u = 哈希(A,B);

    如果(u == 0)中止连接();

    客户端:if(B == 0) abortConnection();

    u = 哈希(A,B);

    如果(u == 0)中止连接();

    x = 哈希(s, p);

    S = ((B - k*(g^x %N)) ^ (a + u*x)) %N;

    K = 哈希(S);

    Mc = Hash(Hash(N) XOR Hash(g), Hash(I), s, A, B, K);

    发送到服务器(M);

    服务器: S = ((A*(v^u %N)) ^ B) %N; K = 哈希(S);

    Ms = Hash(Hash(N) XOR Hash(g), Hash(I), s, A, B, K);

    if(Mc == Ms) {Rs = Hash(A, M, K); 发送到客户端(Rs);}

    客户端: Rc = Hash(A, M, K);

    if(Rc == Rs) ALL_OK();

0 投票
0 回答
170 浏览

srp-protocol - 安全远程密码 SRP_set_authenticator()

我在嵌入式设备中使用安全远程密码协议,该设备没有显示器来显示用户名/密码,也没有键盘来输入它们。有人告诉我我可以使用 SRP_set_authenticator() 而不是 SRP_set_params() ,这需要我预先计算 SRP 验证程序。我的问题是如何为我的用户名/密码检索 SRP 验证程序?有关信息,我在 MS Visual Studio 上运行了 SRP 库,我认为它可以帮助检索 SRP 验证程序,但我不知道如何。是否只是通过读取 srp_st 结构的验证器字段。如果我得到答案,我保证会支持你。提前致谢。

0 投票
0 回答
281 浏览

delphi - SRP 德尔福实施

终于在delphi中完成了SRP协议的实现!使用 openssl 库计算哈希和 Bignum。

最后的实现并不复杂。但我有疑问:

1)我可以使用随机对N,g。N 4096 位是否足够安全?

2) K,与 RFC 5054 一样,是一个强会话密钥,但长度为 768 字节,N 到 4906 位。那么如何才能正确地使用这个会话密钥和 AES256 呢?

3)最后,有什么方法可以测试我编写的实现是否正常工作?有没有人可以给我建议?

放置代码,考虑到它还没有优化,类型N,G可能是类var。

在此先感谢大家。

截屏

在此处输入图像描述

0 投票
0 回答
97 浏览

javascript - Web 客户端和 Java 服务器之间的安全协议

我正在尝试在 Web 客户端 (HTML) 和服务器之间开发一个安全层。由于技术限制,无法启用 HTTPS。

如何保护服务器,以便只处理来自受信任来源的请求?

我已经查看了Nimbus SRP,但密码必须存储在客户端,因此可以看到以供检查。

0 投票
2 回答
15395 浏览

ruby-on-rails - AWS Cognito 用户身份验证缺少必需参数 SRP_A

我正在尝试通过ruby​​ SDK 使用 AWS Cognito 服务进行用户身份验证。

我可以注册,使用方法确认注册过程

并使用confirm_sign_up

但是在尝试通过initial_auth登录用户时,我收到一个错误缺少必需的参数SRP_A

SRP_A 指示在哪里可以找到它。

我已经搜索过这个问题,建议使用admin_initiate_auth我认为不是最佳实践的用户登录方法。

0 投票
2 回答
9999 浏览

python - 使用 python boto3 为 AWS Cognito 实现 USER_SRP_AUTH

Amazon 提供 iOS、Android 和 Javascript Cognito SDK,这些 SDK 提供高级身份验证用户操作。

例如,请参阅此处的用例 4:

https://github.com/aws/amazon-cognito-identity-js

然而,如果你使用 python/boto3,你得到的只是一对原语:cognito.initiate_authcognito.respond_to_auth_challenge.

我正在尝试将这些原语与pysrplib 一起使用USER_SRP_AUTH流进行身份验证,但是我所拥有的不起作用。

它总是失败并显示“调用 RespondToAuthChallenge 操作时发生错误 (NotAuthorizedException):用户名或密码不正确。” (用户名/密码对适用于 JS SDK。)

我的怀疑是我构建了错误的质询响应(步骤 3),和/或在需要 base64 时传递 Congito 十六进制字符串,反之亦然。

有没有人得到这个工作?有人看到我做错了什么吗?

我正在尝试复制authenticateUser在 Javascript SDK 中找到的调用行为:

https://github.com/aws/amazon-cognito-identity-js/blob/master/src/CognitoUser.js#L138

但我做错了什么,无法弄清楚是什么。