我的网站还没有投入生产,在上线之前我想要一些关于密码哈希的建议,而且很难改变。一般来说,我的网站托管在 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;
}
我在不同的地方发现了这些功能,我对安全性了解不多,所以只想得到一些反馈。