相关名次解释:
N - A large safe prime (N = 2q+1, where q is prime) All arithmetic is done modulo N.
g - A generator modulo N
k - Multiplier parameter (k = H(N, g) in SRP-6a, k = 3 for legacy SRP-6)
s - User's salt
I - Username
p - Cleartext Password
H() - One-way hash function
^ - (Modular) Exponentiation
u - Random scrambling parameter
a,b - Secret ephemeral values
A,B - Public ephemeral values
x - Private key (derived from p and s)
v - Password verifier
运算及含义:
sha_pass_hash:使用这个函数进行Sha1Hash哈希std::string AccountMgr::CalculateShaPassHash(std::string& name, std::string& password)后得到的值。
N: A large safe prime (N = 2q+1, where q is prime), All arithmetic is done modulo N. 在MaNGOS里N被设成N.SetHexStr("894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7");
s: 32个字节的随机数,算过一次后保存在数据库里。
x: 计算v值使用到的x,即私钥是s与数据库里的sha_pass_hash的倒置的Sha1Hash
v: g^x mod N,验证密码时使用Password verifier,算过一次后保存在数据库里。
g: g = 7
b: 为19个字节的随机数,每次client连接认证的时候重新生成。
a: 19个字节的随机数,由客户端产生。
B: 公钥, gmod = g^b, N , B = ((v * 3) + gmod) % N
K: 认证通过后最终保存到数据库里的sessionkey,(1)计算A 客户端公钥A = g^a mod N a为19为随机数,(2)计算x,x = sha(s, I),I = sha(“username : password”); (3)计算u,u = sha(A, B) //(服务公钥,客户公钥);(4)计算S,S = (B - g^x*3)^(a+u*x); (5)计算K,S为32位,K为40位是 sha(s奇部分)20位, sha(s偶部分)20位的奇偶交错组合。
M: 20个字节的数,用于与client传过来的最终结果M1进行对比,如果M和M1每个字节都相等则验证通过。计算方法:t3 = sha(N)[i] ^ sha(g)[i],t4 = sha(username),M = sha(t3,t4,s,A,B,K)
k: k = 3