如何在php5.3.0中使用sha256
Posted
技术标签:
【中文标题】如何在php5.3.0中使用sha256【英文标题】:How to use sha256 in php5.3.0 【发布时间】:2010-12-17 16:07:21 【问题描述】:我正在使用 sha256 来加密密码。我可以将sha256加密密码保存在mysql中。但我无法使用相同的子句登录。
插入代码:
<?php
error_reporting(E_ALL ^ E_NOTICE);
$username = $_POST['uusername'];
$passcode = $_POST['ppasscode'];
$userflag = $_POST['uuserflag'];
//$passcodeen = hash('sha256',$passcode);
$passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode));
$conn = mysql_connect("localhost","charles","charles") or die("connection failed with DB:".mysql_error());
mysql_select_db("sessiondb");
$query = "INSERT INTO users(username,passcode,userflag) values('$username','$passcodeen','$userflag')";
选择代码:
<?php
error_reporting(E_ALL ^ E_NOTICE);
@mysql_connect("localhost","charles","charles") or die("Connection failed".mysql_error());
@mysql_select_db("sessiondb") or die("Database doesn't exist".mysql_error());
//get user input
$username = $_POST['username'];
$ppasscode = $_POST['ppasscode'];
//$passcodeen = hash('sha256', $ppasscode);
$passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode));
//get session value from mysql
$query = @mysql_query("select username, userflag from users where username ='$username' and passcode = '$passcodeen'") or die("Query execution failed".mysql_error());
有什么问题吗?我很困惑。谢谢。
【问题讨论】:
您是否使用 VARCHAR 字段来存储密码?因为 varchars 的最大大小是 255 个字符... 您能否发布一个哈希示例,因为它存储在数据库中,与代码中的样子对比? 对于 sha256,您需要一个至少 64 个字符的 VARCHAR。 @davethegr8,是的,我使用 varchar(255),对吗? 检查您的代码是否被魔术引号击中,如下所示:$passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode));
【参考方案1】:
这可能是一个错字吗? (ppasscode 中有两个 P,是有意的吗?)
$_POST['ppasscode'];
我会确保这样做:
print_r($_POST);
并确保那里的数据准确无误,然后回显它应该是什么样子:
echo hash('sha256', $_POST['ppasscode']);
将此输出与您在数据库中的输出进行比较(手动)。通过这样做,您正在探索可能的故障点:
-
从表单中获取密码
散列密码
存储的密码
两者的比较。
【讨论】:
【参考方案2】:首先,sha256 是一种散列算法,而不是一种加密。加密需要有一种方法将信息解密回其原始值(除了冲突)。
查看您的代码,如果您提供正确的参数,它似乎应该可以工作。
首先尝试在代码中使用文字字符串,并验证其有效性,而不是使用$_POST[]
变量
尝试将比较从数据库查询转移到代码(获取给定用户的哈希并与您刚刚计算的哈希进行比较)
但最重要的是,在以任何形式公开部署此功能之前,请记住清理您的输入。不允许将任意 SQL 插入到查询中。最好的办法是使用参数化查询。
【讨论】:
+1 获取有关输入验证的建议。参数化查询为极少的额外编码提供了大量控制。【参考方案3】:您应该使用像 http://en.wikipedia.org/wiki/Bcrypt 这样的自适应散列来保护密码
【讨论】:
【参考方案4】:更好的解决方案是使用 Anthony Ferrara 提供的出色兼容性脚本:
https://github.com/ircmaxell/password_compat
请,并且,在检查密码时,如果需要,请始终添加一种方式(最好是异步的,这样它不会影响定时攻击的检查过程)来更新哈希。
【讨论】:
【参考方案5】:首先是创建comparison of functions of SHA 并选择支持您的编程语言 (PHP) 的最安全算法。
然后您可以阅读官方文档来实现hash()
函数,该函数接收您选择的哈希算法和原始密码作为参数。
sha256 => 64 bits
sha384 => 96 bits
sha512 => 128 bits
散列算法越安全,散列成本和从服务器端恢复原始值的时间就越高。
$hashedPassword = hash('sha256', $password);
【讨论】:
因误导而投反对票。散列不是加密。而且也没有“解密”。 @LeighBicknell 更新以上是关于如何在php5.3.0中使用sha256的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Crypto++ 中使用 RSA OAEP SHA-256 加密/解密数据
如何在Eclipse中使用sha1或sha256使用ESB工具?
如何在基于 Android 的 Java 中使用 SECRET KEY 制作 HMAC SHA256? [复制]