我的PHP安全算法是否有效存储用户凭据?

时间:2010-08-20 02:52:51

标签: php security passwords authentication

这个问题是关于我遇到的特定编程问题 - 我想确保我的代码(和软件算法)足以在数据库中存储用户凭据。

// Get a 32 character salt like '69Mt6nexL1rsjWnu011S53MpB/WmT4Vl'
$passwordSalt = Security::generateBase64Salt();

$user = new User();
$user->setUsername($_POST['username']);

// $_POST['password'] comes in as a 128 character string
// Client side javascript is used to sha512 the string before sending it over POST
// see http://pajhome.org.uk/crypt/md5/
// This prevents novice eavesdroppers from capturing the raw password in plaintext
$user->setPassword(
    hash('sha512', $passwordSalt.$_POST['password'])
);
$user->setPasswordSalt($passwordSalt);
$user->save();

这是特定密码的数据库条目:

alt text

密码:

69a78a7586a111b8a567b2d4f42f93f01fb59d337f7fa3c35949a66b246095778c1fa01ff4026abace476091e1e9a183bbdec1c31b12ce3f786921895c98cf6f

69Mt6nexL1rsjWnu011S53MpB / WmT4Vl

问题:

  • 此算法是否存在继承缺陷?
  • 将盐存储在与salt +密码哈希相同的数据库和表中是否可以?
  • 如果桌面上有数十万用户,那么拥有128个大字符的密码会导致登录性能问题(数秒级)吗?
  • 可以撤消此数据以生成原始密码吗?

乐趣:

如果您能使用salt和salt +密码哈希向我提供原始密码,我将PayPal $ 5。

2 个答案:

答案 0 :(得分:6)

Kendall所说的一切,以及......

..跳过你在javascript中执行客户端的哈希。相反,只需购买SSL证书并通过https发布凭据。将保护你免受新手窃听者和经验丰富的攻击者。

此外,一旦你在客户端进行哈希,那么就会成为你的密码。如果窃听者取消了哈希密码,他可以将其传递给您的服务器,事情就可以了。

答案 1 :(得分:5)

此算法是否存在任何继承缺陷?

它不受彩虹攻击(由于随机盐)。 Sha512是一个相当新的算法,但目前没有已知的碰撞,所以它可能非常安全。存储密码的方式很好。检查过程也很重要(速率限制暴力攻击)并锁定服务器免受可能试图访问数据库的其他角度的攻击。如果攻击者能够访问数据库,他可能会很快提取出简单的密码,但任何复杂的密码都可能超出简单的暴力攻击(即使他可以直接访问哈希)。

将盐存储在与salt +密码哈希相同的数据库和表中是否可以?

如果您希望能够验证密码(我假设您想要),您几乎必须将它们存储在一起。腌制密码的主要原因是消除彩虹攻击的可能性。通常,这些数据甚至与散列密码存储在同一列中,使用符号将它们分开。

如果表中有数十万用户,那么拥有128个大字符的密码会导致登录性能问题(数秒级)吗?

基准测试检查密码(hash('sha512', $salt.$password_attempt ))所需的时间(以秒为单位)。找到该数字的倒数,这可能接近每CPU核心每秒可以处理的密码尝试次数。

可以撤消此数据以生成原始密码吗?

是的,但这需要很多努力,因为你使用随机盐,彩虹表将不再起作用,并且sha512需要相当数量的CPU来运行并且没有已知的冲突。如果密码相当简单,可能会猜到。如果你担心扭转哈希值,那么对密码的复杂性设置一个低限可能是一个好主意(根据字典检查它,它是否包含上/下/数字/符号)。