我尝试使用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();
最佳答案 在您自己实施任何安全协议时我会非常小心.很难做到正确并且最常见的是通过实施复杂的安全协议,如果你做得不对,你实际上会损害系统的安全性(例如错误的内存管理,定时攻击的漏洞等).
一般建议是使用经过审核,可信(开源)和维护的库来执行加密操作.这些库通常也提供更好的性能,因为它们使用专门的HW加密指令(例如,AES在现代硬件中得到很好的支持,使其快速且不易受到定时攻击).
因此,根据我的回答,看一下应该提供SRP协议实现的库http://bouncycastle.org/.
而且,你应该考虑用例.您是否为数百万用户开发超级安全的邮件服务器,或者您只想用假日照片保护您的家庭服务器?在第一种情况下,可能值得拥有具有最先进安全算法的非常强大和安全的系统.在后一种情况下,它不是 – 良好的密码和SSL将做:-).