关于SRP算法的问题



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

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

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

  3. SRP算法正确吗?

    //M-模数、g-生成器、k-乘法器、I-username、p-密码、s-盐、v-pass验证器

    注册:

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

    sendToServer(I,s,v);

    服务器:保存(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)中止Connection();

    客户端:如果(B==0)中止连接();

    u=哈希(A,B);

    如果(u==0)中止Connection();

    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);

    sendToServer(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);sendToClient(Rs);}

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

    如果(Rc==Rs)ALL_OK();

当您自己实现任何安全协议时,我都会非常小心。很难做到这一点,而且最常见的情况是,通过实施复杂的安全协议,如果你做不好(例如错误的内存管理、定时攻击漏洞等),你实际上会危及系统的安全。

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

因此,根据我的回答,看看图书馆http://bouncycastle.org/其应当提供SRP协议的实现。

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

OpenSSL具有TLS-SRP。

对于您正在寻找的值,请阅读RFC 5054。

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

如果你有兴趣实现SRP的细节,谷歌有C-谷歌csrp代码。

最新更新