在drupal中为用户密码添加用户特定的salt

时间:2011-08-18 20:15:29

标签: php drupal drupal-6

我正在将一个相当大的asp站点迁移到drupal。我已经设法迁移了大部分内容,现在我在迁移用户方面遇到了一些麻烦。

在ASP站点中,每个成员都有一个密码和一个salt列,当登录时,他们提供的密码会附加salt和sha1加密,然后与db密码进行比较。

我如何在drupal 6中实现这一点? Drupal 6默认没有盐。我找到了一个drupal盐模块,但它非常简单,只存储了一个全域盐值。

我是否需要在用户表中添加salt列并向drupal6登录函数添加一些自定义逻辑?我意识到这是一种不好的做法,因为将应用程序升级到更高版本的drupal可能会有问题。但是我们正在使用一堆drupal 6特定模块,所以我觉得升级到drupal 7将是一场噩梦,无论如何。以前有人有这个问题吗?什么是最简单的(该死的固定费率网络工作:)好的方法来解决它?

基本上我在ASP应用程序中有一个包含以下列的用户表:

姓名| Password_hash |盐|等

我需要一些方法将其迁移到Drupal。

2 个答案:

答案 0 :(得分:2)

我不确定这在Drupal 6中是如何工作的,但Drupal 7实现了与比较字符串中的db密码比较时使用的salt。在password.inc中查看_password_crypt()时,$ salt定义为

$salt = substr($setting,4,8);

$ setting变量是db密码的前12个字符。 然后将盐添加到$ password。

$hash = hash($algo, $salt . $password);

重要的是要考虑到这种散列已经多次完成,以便显着增加安全性。为了知道它被散列了多少次,db密码的第二个字符(它实际上在$符号之间)用于知道重复的次数。此字符与名为 itoa64 的字符串进行比较,因此此字符的位置是log2重复次数。

$itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

log2重复次数的含义是实际数字是该数字的2的幂。因此,考虑到第一个数字在7到30之间,重复次数在128到1 073 741 824之间。

最后,加密的密码在base64中编码,检查(比较编码前后的长度)并返回以由user_check_password进行比较或由user_hash_password用于随机哈希存储使用_password_generate_salt()生成。

答案 1 :(得分:1)

为此,我强烈建议Password module 1.0分支。它使您能够提供自己的自定义password.inc文件,以确定如何对密码进行散列和检查。