目前据说MD5部分不安全.考虑到这一点,我想知道用于密码保护的机制.
这个问题,"双重哈希"密码是否比仅仅哈希一次更安全? 建议多次散列可能是一个好主意,而如何实现单个文件的密码保护?建议使用盐.
我正在使用PHP.我想要一个安全快速的密码加密系统.散列密码一百万次可能更安全,但也更慢.如何在速度和安全性之间取得良好的平衡?另外,我更喜欢结果具有恒定数量的字符.
另外,我应该在数据库中存储两个字段(例如,一个使用MD5,另一个使用SHA)?它会使它更安全或更不安全吗?
如果我不够清楚,我想知道使用哪种散列函数以及如何选择好的盐以便拥有安全和快速的密码保护机制.
相关问题并不完全涵盖我的问题:
PHP中的SHA和MD5有什么区别
简单密码加密
存储密钥的安全方法,asp.net的密码
如何在Tomcat 5.5中实现salted密码
据我了解,生成盐的最佳做法是使用源代码中存储的一些神秘公式(甚至魔术常量).
我正在研究一个我们打算作为开源发布的项目,但问题是源代码是生成盐的秘密公式,因此能够在我们的网站上运行彩虹表攻击.
我认为很多人在我面前都考虑过这个问题,我想知道最佳做法是什么.在我看来,如果代码是开源的话,根本就没有盐,因为盐可以很容易地进行逆向工程.
思考?
我开始想,也许我的登录系统不如我想象的那么安全.首先,我将用语言向你解释我在做什么.
当用户注册时,会生成一个16个字符的salt.我将盐存储在数据库中的一个名为"salt"的字段中我将散列密码+ salt(它们被散列在一起hash("sha256", $salt.$password);)存储在一个名为"password"的字段中
当用户尝试登录时,我从数据库中获取"密码"字段和"盐"字段,以及其他一些内容.
要检查他们是否正确输入了密码,我这样做:
$hashed = hash("sha256", $row['salt'].$pass);
if ($row['password'] == $hashed) {
//success
Run Code Online (Sandbox Code Playgroud)
($ row是数据库中的fetched数组.$ row ['salt']是数据库中的salt,$ pass是他们输入的密码,$ row ["password"]是数据库中的散列传递+ salt )
我在想,而且在我看来,我的盐提供的安全性很小(或没有).我向你们提出的问题就是:我的方法是否提供了额外的安全性(或者甚至是安全的吗?)
另外,我有第二个'问题'.我想验证这个"检查登录"脚本不能被欺骗/欺骗,以便在没有密码的情况下进入某人的帐户.
session_start();
require_once 'db_connect.php';
//If the session variable "id" isn't set (i.e. they aren't logged in)
if (!isset($_SESSION['id'])) {
//Check if they wanted to be "remembered" (so they have 2 cookies
if (isset($_COOKIE['rem_user']) && isset($_COOKIE['rem_pass']))
{
$query = "SELECT
id,
password,
auth,
email,
username
FROM users
WHERE
username='".$_COOKIE['rem_user']."'
AND active IS NULL" …Run Code Online (Sandbox Code Playgroud) encryption ×2
php ×2
security ×2
hash ×1
login ×1
mysql ×1
open-source ×1
passwords ×1
protection ×1
rainbowtable ×1
salt ×1
session ×1