2013-07-07 67 views
3

我一直在寻找一个首选位置来创建密码salt。我应该在哪里创建密码salt

对我来说,创建数据库级别的密码salt并在数据库级别对输入的密码+ salt进行哈希处理很有意义。

但是,由于我是一个登录安全超级小白,我想知道哪个位置最适合创建盐本身。

从我已阅读的内容中,我创建了一个存储过程,它需要userloginpassword并比较存储的盐串联以验证输入的密码是否正确。

我现在需要知道的是,在新用户帐户上应该在哪里创建密码salt?

我的意图是如果用户忘记了密码不可退还。如果他们忘记了它给了他们一个温度,然后需要改变。同样,如果密码改变,我也想相应地改变盐。

我对整体安全没有幻想,只想减轻机会。

回答

2

生成盐并散列密码的地方应该在代码中,而不是在数据库中。

要哈希密码,您需要像BCrypt或PBKDF2这样的慢密钥派生函数,但大多数数据库都没有这些函数的实现。这些函数有一个成本因子,它控制计算散列值所需的时间(对抗暴力破坏的时间越长,安全性越高)。 salt和成本因子通常与password-hash存储在同一个字符串中,因此只需要一个字段来存储散列。

要验证密码,首先必须使用password-hash的用户名进行搜索,然后该函数可以提取使用的salt和成本因子,最后可以使用相同的参数对输入的密码进行散列处理以进行比较。

在代码中还有另一个原因,密码系统必须转换为更强大的算法,或者必须在将来增加成本因素​​,那么在代码中处理向后兼容性要容易得多,就像使用SQL语句。

+1

在这个实现模式上有什么好的读法?在代码级别执行此操作http://crackstation.net/hashing-security.htm – GoldBishop

+0

链接的文章正是您所需要的,它显示了使用PBKDF2算法的代码,salt将自动生成,并包含在得到的散列值。有关更多一般信息,您也可以查看我的[tutorial](http://www.martinstoeckli.ch/hash/en/index.php)。 – martinstoeckli

+0

查看了解决方案和其他一些。有没有办法让keymaster(代码)和gatemaster(db)结构?那样的话,你必须同时拥有这两个部分才能有效地工作?大多数解决方案仅依靠源代码来处理所有聚合,而不是将部分资源放在数据库上(mssql) – GoldBishop

相关问题