1

我的网站还没有投入生产,在上线之前我想要一些关于密码哈希的建议,而且很难改变。一般来说,我的网站托管在 EC2 上,并将使用 Amazon RDS。我将进行安全设置,因此访问数据库的唯一方法是连接到 EC2 机器。我的网站不会存储任何真正敏感的财务数据,但它肯定会存储电子邮件地址和密码,而且我很可能会允许贝宝交易,因此用户的电子邮件地址通常也恰好是贝宝地址。

我使用哈希算法的部分原因是因为我正在使用 Corona SDK 构建应用程序。我打算在客户端和服务器上使用类似的散列函数。例如,我可以在客户端上散列密码,然后通过 ssl 将散列后的密码发送到服务器。作为旁注,我永远不会将用户的密码(散列或未散列)存储在客户端上。

一般的问题

  • 如果我允许用​​户通过移动应用程序登录,是对数据进行哈希处理然后通过 SSL 发送更好,还是更好地获取用户输入的内容并通过 SSL 发送。我担心在客户端上公开我的散列算法是否是一个非常糟糕的主意。相信 SSL 是安全的并改为发送原始数据可能会更好。
  • 您对改进我用来散列和存储数据的方法有什么建议吗?更多详情如下。

所以一般的想法是,当用户注册时,我为每个用户创建一个唯一的用户密钥。该密钥存储在数据库中。使用此密钥对电子邮件地址进行加密,并使用相同的密钥对密码进行哈希处理。

$key = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); 

密码哈希是使用以下函数创建的。

function hash_string($data,$key) {
    $hash = hash_hmac('md5', $data, $key);
    for ($i = 1; $i <= 100; $i++) {
        $data = $hash . $data . $key;
        $hash = hash_hmac('md5', $data, $key);
    }   
    $hash = base64_encode($hash);
    return $hash;
}

使用以下函数对电子邮件地址进行加密

function encrypt_text($key,$string)
{
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);  
    $encrypttext = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_ECB, $iv));
    return $encrypttext;
}

我在不同的地方发现了这些功能,我对安全性了解不多,所以只想得到一些反馈。

4

1 回答 1

1

您将用于加密的密钥与加密信息存储在同一个数据库中?那么一旦有人可以访问您的数据库,信息以及密钥(以下称为加密本身)就毫无用处。免得麻烦。

对于密码散列,有很多关于这个的讨论,关于 SO 也有很好的答案,你可能应该远离 MD5 并使用更好的盐。

于 2013-06-02T18:49:42.137 回答