3

我尝试使用 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();

4

2 回答 2

2

在您自己实施任何安全协议时,我会非常小心。很难做到正确,而且大多数情况下,通过实施复杂的安全协议,如果您没有做到正确(例如错误的内存管理、定时攻击的漏洞等),您实际上会危及系统的安全性

一般的建议是使用经过审计的、受信任的(开源)和维护的库来做加密的东西。这些库通常也提供更好的性能,因为它们使用专门的硬件加密指令(例如,现代硬件很好地支持 AES,使其速度快且不易受到定时攻击)。

所以根据我的回答,看看应该提供 SRP 协议实现的库http://bouncycastle.org/ 。

此外,您应该真正考虑用例。您是在为数百万用户开发超级安全的邮件服务器,还是只想用假日照片保护您的家庭服务器?在第一种情况下,使用最先进的安全算法可能值得拥有非常强大和安全的系统。在后一种情况下,它不是 - 好的密码和 SSL 会做:-)。

于 2015-02-26T19:19:05.007 回答
0

OpenSSL 具有 TLS-SRP。

对于您要查找的值,请阅读RFC 5054

  • N、g 和 k 不需要保密。
  • 选择不当的 N 和 g 可能会危及加密计算的安全性,因此您应该知道自己在做什么,或者选择 RFC 中推荐的值。
  • k,是从 N 和 g 计算出来的,所以一旦你选择了这些,你就可以得到 k。

如果您对实现 SRP 的详细信息感兴趣,Google 提供了 C- Google csrp 代码中的代码

于 2015-06-18T18:20:24.670 回答