我尝试使用 SRP 算法,但我有一些问题:
使用 SSL/TLS 注册和授权 SRP 算法是否是一个好的选择?对于仅使用 SSL/TLS 的所有其他传输? 我将使用 C# 套接字来实现。
如何生成g、k、N?使用这些类似应用程序常量是否安全?
那个 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();
最佳答案
在您自己实现任何安全协议(protocol)时,我会非常小心。做到正确是非常的,而且大多数情况下,通过实现复杂的安全协议(protocol),如果您不正确,实际上会危及系统的安全性(例如,错误的内存管理、时序攻击漏洞、等)。
一般建议是使用经过审核、受信任(开源)和维护的库来进行加密工作。这些库通常也提供更好的性能,因为它们使用专门的硬件加密指令(例如,AES 在现代硬件中得到很好的支持,使其速度快且不易受到时序攻击)。
所以根据我的回答,看看图书馆http://bouncycastle.org/它应该提供 SRP 协议(protocol)的实现。
此外,您应该真正考虑用例。您是在为数百万用户开发 super 安全的邮件服务器,还是只想用假日照片保护您的家庭服务器?在第一种情况下,拥有非常强大和安全的系统以及最先进的安全算法可能是值得的。在后一种情况下,它不是 - 好的密码和 SSL 就可以:-)。
关于security - 关于SRP算法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28528673/