关于SRP算法的问题
Questions about SRP algorithm
我正在尝试使用 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();
在您自己实施任何安全协议时,我会非常小心。 非常 很难做到正确,而且大多数情况下,通过实施复杂的安全协议,如果你没有做到正确(例如,错误的内存管理、漏洞计时攻击等)。
一般建议是使用经过审核、受信任(开源)和维护的库来进行加密工作。这些库通常也提供更好的性能,因为它们使用专门的硬件加密指令(例如,AES 在现代硬件中得到很好的支持,使其速度快且不易受到时序攻击)。
所以根据我的回答,看看应该提供 SRP 协议实现的库 http://bouncycastle.org/。
此外,您应该真正考虑用例。您是在为数百万用户开发超级安全的邮件服务器,还是只想用假日照片保护您的家庭服务器?在第一种情况下,拥有非常强大和安全的系统以及最先进的安全算法可能是值得的。在后一种情况下,它不是 - 好的密码和 SSL 就可以了:-)。
OpenSSL 有 TLS-SRP。
对于您要查找的值,请阅读 RFC 5054。
- N、g 和 k 不需要保密。
- 选择不当的 N 和 g 会危及
密码计算,所以你应该知道你是什么
做,或选择 RFC 中推荐的值。
- k,是从N和g计算出来的,所以一旦你选择了那些,你就可以得到k。
如果您有兴趣实现 SRP 的细节,Google 有可用的 C 代码 - Google csrp code。
我正在尝试使用 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();
在您自己实施任何安全协议时,我会非常小心。 非常 很难做到正确,而且大多数情况下,通过实施复杂的安全协议,如果你没有做到正确(例如,错误的内存管理、漏洞计时攻击等)。
一般建议是使用经过审核、受信任(开源)和维护的库来进行加密工作。这些库通常也提供更好的性能,因为它们使用专门的硬件加密指令(例如,AES 在现代硬件中得到很好的支持,使其速度快且不易受到时序攻击)。
所以根据我的回答,看看应该提供 SRP 协议实现的库 http://bouncycastle.org/。
此外,您应该真正考虑用例。您是在为数百万用户开发超级安全的邮件服务器,还是只想用假日照片保护您的家庭服务器?在第一种情况下,拥有非常强大和安全的系统以及最先进的安全算法可能是值得的。在后一种情况下,它不是 - 好的密码和 SSL 就可以了:-)。
OpenSSL 有 TLS-SRP。
对于您要查找的值,请阅读 RFC 5054。
- N、g 和 k 不需要保密。
- 选择不当的 N 和 g 会危及 密码计算,所以你应该知道你是什么 做,或选择 RFC 中推荐的值。
- k,是从N和g计算出来的,所以一旦你选择了那些,你就可以得到k。
如果您有兴趣实现 SRP 的细节,Google 有可用的 C 代码 - Google csrp code。