我尝试使用 SRP 算法,但我有一些问题:
使用 SSL/TLS 进行注册和授权 SRP 算法是一个不错的选择吗?对于仅使用 SSL/TLS 的所有其他传输?我将使用 C# Sockets 来实现。
如何生成g、k、N?使用这些类似应用程序常量是否安全?
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();