我尝试使用SRP算法,但我有一些问题:
使用SSL / TLS注册和授权SRP算法是一个不错的选择吗?对于仅使用SSL / TLS的所有其他传输? 我将使用C#套接字来实现。
如何生成g,k,N?使用这些应用程序常量是否安全?
SRP算法是对的吗?
// M模数,g生成器,k乘数,I用户名,p密码,s-salt,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);
if(u == 0)abortConnection();
客户:if(B == 0)abortConnection();
u =哈希(A,B);
if(u == 0)abortConnection();
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);
if(Rc == Rs)ALL_OK();
答案 0 :(得分:2)
在您自己实施任何安全协议时我会非常小心。 非常很难做到正确并且最常见的是通过实施复杂的安全协议,如果你做得不对,你实际上会损害系统的安全性(例如错误的内存管理,时间漏洞)攻击等)。
一般建议是使用经过审核,可信(开源)和维护的库来执行加密操作。这些库通常也提供更好的性能,因为它们使用专门的HW加密指令(例如,AES在现代硬件中得到很好的支持,使其快速且不易受到时序攻击)。
因此,根据我的回答,请查看应提供SRP协议实施的库http://bouncycastle.org/。
此外,您应该考虑用例。您是否为数百万用户开发超级安全的邮件服务器,或者您只想用假日照片保护您的家庭服务器?在第一种情况下,可能值得拥有具有最先进安全算法的非常强大和安全的系统。在后一种情况下,它不是 - 良好的密码,SSL也可以: - )。
答案 1 :(得分:0)
OpenSSL有TLS-SRP。
对于您要查找的值,请阅读RFC 5054。
如果您有兴趣实施SRP的详细信息,Google可以使用C语言提供代码 - Google csrp code。