i = S[n-1]256 * S[n-2]256^2 * S[n-3]...256^(n-1) * S[0]
这里i是一个整数,S[x]是S的第x个字节的值 。在人们的术语中,由字节组成的字符串是以256为基来表示的整数,并且是最高有效位优先 。当转换成为一个字符串时,S[0]必须是一个非零值(填充考虑作为一个分离的,独立的过程) 。这种转换方法适合于文件存储、内存内部表示和大整数值的网络传输中 。除非另外的说明,就将假设为这种映射 。
假如实现需要填充一个代表整数值的字符串,建议用值为零的字节加到字符串的开头 。反过来,将其转换为整数将自动丢弃前导为零的字节,这种填充模式倾向于产生更少的错误 。
在这个文档中使用的SHA散列函数,指的是在[SHA1]中描述的SHA-1消息摘要算法
3.SRP-SHA1机制
这一节描述一个SRP鉴别和秘钥交换系统的实现,它使用了SHA散列函数来产生会话密钥和鉴别证实 。
主机用三元组的形式保存用户的口令
{ , , }
口令实体由如下方法来产生:
= random()
x = SHA(SHA(":"))
= v = g^x % N
“”符号代表字符串连接,^操作符代表求幂运算,%操作符代表整数求余运算 。大多数的实现在一个单独的阶段执行求幂和求余运算,以避免产生难以处理的中间结果 。注重,SHA的160位的输出在被操作前要被明确转换成一个整数 。
鉴别通常由客户端发起 。
Client Host
-------- ------
U = -->
<-- s =
在给主机鉴定它自身的时候,客户会收到保存在主机中,并且在它的用户名下的salt 。
a = random()
A = g^a % N -->
v =
b = random()
<-- B = (vg^b) % N
p =
x = SHA(sSHA(U":"p))
S = (B - g^x) ^ (au * x) % N S = (A * v^u) ^ b % N
K = SHA_Interleave(S) K = SHA_Interleave(S)
(这个函数会在下节中描述)
客户端产生一个随机数,生成以g为底的幂,再以一个素数为模取余,把结果发送给主机 。主机做同样的事情,但要加上公共验证符,然后发给客户端 。这样,两端就共享了基于各自因子的会话密钥 。
参数u是一个32位的无符号整数,它的值来自于B的SHA1散列的第一个32位,这里最高有效位优先 。
假如B % N结果为零,客户端必须中断鉴别过程 。
假如B % N结果为零,主机必须中断鉴别企图 。主机必须在从客户端收到A之后,发送B,千万不要在这之前 。
在这一点上,客户端和服务器端将有一个安全的公用会话密钥(比如不会被外界的一方知道) 。为了完成鉴别,他们必须互相证实他们的密钥是同样的 。
M = H(H(N) XOR H(g)H(U)sABK)
-->
<-- H(AMK)
服务器端用它自己的K计算M并且和客户端的回应进行比较 。假如它们不匹配,在它尝试回答客户端的查问前,服务器必须中断并发出一个错误信号 。这样任何事情都不会危及用户密码的安全性 。
假如服务器收到正确的响应,它就发出自己的证实给客户端 。客户端用它自己的K计算预期的响应,来验证服务器的真实性 。假如客户端响应正确,服务器必须用它自己的散列值作为响应 。
在这个协议的描述中,处理过程不必和实际的协议消息一对一的对应 。这里的描述仅仅是为了阐明不同参数的关系和它们如何计算 。比如,有可能一个SRP-SHA1机制的实现,可以加固某些流程,如下所示:
Client Host
-------- ------
U, A -->
<-- s, B
H(H(N) XOR H(g)H(U)sABK)
-->
<-- H(AMK)
在这个协议的使用中,N和g的值必须由双方讨论来达成一致 。它们可以被提前设置好,或者主机把它们发送给客户端 。在后一种方式中,主机将在第一个消息中连带salt把参数发送出去 。为了最大化安全性,N可以是一个安全的素数(也就是,一个类似于N=2q1形式的数,同时q是个素数) 。而且,g将是一个以N为模的生成元,意味着,对任何X,有0
推荐阅读
- 腊肠和香肠的区别
- Internet电子邮件保密增强:Part1-消息编码和鉴别过程
- 国庆节手抄报画法和步骤 国庆节手抄报的画法
- 区分服务和隧道
- 黑山羊饲喂和育肥要点
- 飞沫传播和空气传播的区别
- 新车怎么去味道和甲醛
- 白葡萄酒和红葡萄酒的区别 白葡萄酒和红葡萄酒有什么不同
- 如何区别梨花和樱花
- 华为手机如何清理垃圾和缓存