关于我的密码哈希算法php mysql corona sdk的一些反馈


Some feedback on my password hashing algorithm php mysql corona sdk

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

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

一般问题

  • 如果我允许用户通过移动应用程序登录,是更好地散列数据,然后通过SSL发送它,还是更好地采取用户输入并通过SSL发送它。我担心的是,在客户端上公开我的哈希算法是否真的是个坏主意。也许最好相信SSL是安全的,并发送原始数据。
  • 你有什么建议来改进我用来散列和存储数据的方法吗?

所以一般的想法是,当用户注册时,我为每个用户创建一个唯一的userkey。这个键存储在数据库中。电子邮件地址使用此密钥进行加密,密码使用相同的密钥进行散列。

$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;
}

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

您将用于加密的密钥存储在与加密信息相同的数据库中吗?那么这就没有意义了,一旦有人访问了您的数据库,那么信息以及密钥(从此加密本身)就没有用了。省省吧。

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