技术开发 频道

Duwamish密码分析篇(二)

  其中CreateSaltedPassword()方法和前面【用户注册】过程相同,用来对散列结果再次执行Salt运算。

// compare the hashed password against the stored password private bool ComparePasswords (byte[] storedPassword, byte[] hashedPassword) { if (storedPassword == null || hashedPassword == null || hashedPassword.Length != storedPassword.Length - saltLength) return false; // get the saved saltValue // 获取已保存在password数据字段中的Salt值 byte[] saltValue = new byte[saltLength]; int saltOffset = storedPassword.Length - saltLength; for (int i = 0; i < saltLength; i++) saltValue[i] = storedPassword[saltOffset + i]; byte[] saltedPassword = CreateSaltedPassword (saltValue, hashedPassword); // compare the values return CompareByteArray(storedPassword, saltedPassword); }
  按字节比较两个字节数组是否相等,分别传入数据表中Password字段byte数组和对当前散列执行Salt运算后的byte数组。
// compare the contents of two byte arrays private bool CompareByteArray(byte[]array1,byte[]array2) { if (array1.Length != array2.Length) return false; for (int i = 0; i < array1.Length; i++) { if (array1[i] != array2[i]) return false; } return true; }
  (3)数据访问层的Customers.LoadCustomerByEmail()方法
 
  该方法根据传入的emailAddress参数,查询Database,返回CustomerData对象。过程比较简单,详细代码请查询Duwamish 7.0范例。
 
  Summary
 
  通过对Duwamish 7.0范例中用户注册和用户登录验证过程的分析,我们确信用户Password以安全的Salt运算结果存放在后台的Database中。其实,在实际的应用系统中,上述的加密过程有一个小问题:就是当有大量的用户忘记了自己的Password,如何帮助他们恢复自己的Password呢?这个问题地球人都不知道,只有通过另外的application来将这些Password重新Update为新的Password,因为散列是单向操作,使用散列算法对原始密码加密后将无法再恢复。
 
  因此,将在《Duwamish密码分析篇(三)》中分析如何实现双向的加密/解密操作,来克服上面提出的问题。

0
相关文章