关于SRP算法的问题

Questions about SRP algorithm

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

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

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

  3. 那个SRP算法对吗?

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

    Registration:

    Client: s = randomString(); x = Hash(s, p); v = g^x %N;

    sendToServer(I, s, v);

    Server: save(I, s, v);

    Authorization:

    Client: a = random(); A = g^a %N;

    sendToServer(I, A);

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

    sendToClient(B, s);

    u = Hash(A, B);

    if(u == 0) abortConnection();

    Client: if(B == 0) abortConnection();

    u = Hash(A, B);

    if(u == 0) abortConnection();

    x = Hash(s, p);

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

    K = Hash(S);

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

    sendToServer(M);

    Server: S = ((A*(v^u %N)) ^ B) %N; K = Hash(S);

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

    if(Mc == Ms) {Rs = Hash(A, M, K); sendToClient(Rs);}

    Client: Rc = Hash(A, M, K);

    if(Rc == Rs) ALL_OK();

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

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

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

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

OpenSSL 有 TLS-SRP。

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

  • N、g 和 k 不需要保密。
  • 选择不当的 N 和 g 会危及 密码计算,所以你应该知道你是什么 做,或选择 RFC 中推荐的值。
  • k,是从N和g计算出来的,所以一旦你选择了那些,你就可以得到k。

如果您有兴趣实现 SRP 的细节,Google 有可用的 C 代码 - Google csrp code