我正在将用户从旧数据库转移到 vBulletin 数据库。
我想要一个脚本来执行此操作,否则将花费很长时间。
我存储了所有用户的密码,就像 md5(password) 一样
但当然,由于盐等原因,这不适用于 vBulletin。
所以我的代码是这样的:
<?Php
mydatabase_connect();
$select=mysql_query("SELECT * from `users`");
while($user=mysql_fetch_array($select)) {
forum_connect();
$check=mysql_query("SELECT * from `user` where `username` = '{$user[username]}'");
if(mysql_num_rows($check)>="1") {
echo "fail";
}else{
$insert=mysql_query("INSERT into `user` SET `username` = '{$user[username]}', `password` = '{$user[password]}', `email` = '{$user[email]}'");
if($insert) {
echo 'success';
}else{
echo 'fail';
}
}
mydatabase_connect();
}
?>
Run Code Online (Sandbox Code Playgroud)
我如何更改它以与 vBulletin 一起使用 - 这样我就可以设置 vBulletin 用户。password字段和 vBulletin 用户。salt正确。请记住我的 $user[password] 或users. password存储为真实文本密码的 md5 哈希值。
谢谢!
请耐心等待,我只学习 PHP 几个星期,所以示例代码可能会让我感到困惑。我想我终于明白加盐了!这是为了保护数据库内的密码(如果遭到破坏)。
我不明白的是,如果黑客试图找出用户的密码(假设这是他们的目标),为什么他们必须破解哈希值?这不是更容易吗?防止密码猜测的唯一方法是限制每天输入 X 次密码或验证码吗?
数据库首先是如何被黑客入侵的?是更多的密码猜测还是可以通过MySQL注入获得哈希值?
谢谢!
我有下面的代码来散列/存储/检索密码数据,但我的第一个单元测试失败了。
我相信它的编码导致了问题,因为当调用 GetBytes 时它会返回byte[38],byte[36]我认为它应该是 20 。
当我将其存储在数据库中时,我必须将其转换为字符串。
有任何想法吗?谢谢
[Fact]
public void EncryptDecryptPasswordShouldMatch()
{
string password = "password";
string passwordKey = string.Empty;
string passwordSalt = string.Empty;
Helpers.CreatePasswordHash(password, out passwordSalt, out passwordKey);
Assert.True(Helpers.PasswordsMatch(passwordSalt, passwordKey, password));
}
public static bool PasswordsMatch(string passwordSalt, string passwordKey, string password)
{
byte[] salt = Encoding.UTF8.GetBytes(passwordSalt);
byte[] key = Encoding.UTF8.GetBytes(passwordKey);
using (var deriveBytes = new Rfc2898DeriveBytes(password, salt))
{
byte[] newKey = deriveBytes.GetBytes(20); // derive a 20-byte key
if (!newKey.SequenceEqual(key))
return false;
}
return true; …Run Code Online (Sandbox Code Playgroud) #!/usr/bin/perlml -Tw
use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser); # show errors in browser
use Authen::Passphrase::BlowfishCrypt;
use Bytes::Random::Secure;
print "Content-type:text/html\n\n";
# read the CGI params
my $cgi = CGI->new;
my $username = $cgi->param("username");
my $password = $cgi->param("password");
if ($username =~ /[^a-zA-Z0-9]/) { die "Illegal characters" };
if ($password =~ /[^a-zA-Z0-9]/) { die "Illegal characters" };
my $settings = './settings.cnf';
use DBI;
my $dsn =
"DBI:mysql:DB;" .
"mysql_read_default_file=$dbsettings";
my $dbh = DBI->connect($dsn, undef, undef,{RaiseError=>1})
or die "Could not connect to database: …Run Code Online (Sandbox Code Playgroud) 我刚刚在 Hosting24.com 上按下“忘记密码”,结果我的密码以纯文本形式通过电子邮件发送给我(见下图)。我联系了他们的技术支持来询问这个问题,他们告诉我:
我们在我们的网站上使用盐加密,密码不以纯文本形式存储。如果您对数据安全有任何疑问,请告知我们。
我的理解是,一旦密码被“加盐”,它就无法恢复为纯文本。我也非常担心,考虑到他们的合作伙伴公司 000webhosting最近成为大规模黑客事件的受害者,这暴露了他们的安全性低于标准。
谢谢。
编辑:
经过几封激烈的电子邮件后,我终于得到了这样的回复:
我们的密码在数据库中使用安全加密方法进行加密。尽管我们确实有一种解密方法(用于防止欺诈),但随着我们重新设计项目并更新代码以遵守新时代标准,所有这一切都将发生变化。很抱歉让您在这件事上失望了。
如有任何其他问题,请联系我们。节日快乐!
'新时代'。惊人的。
编辑:
我向网站发送了此链接来证明这一点,因此我预计他们的技术支持会投大量反对票。
你们都遇到过各种各样的网站,这些网站迫使你们拥有一个6个字符长的密码,必须有1个数字,并且必须押韵"烦人".
显然有一些遗留的原因,为什么有时这是必要的,但有时候这一切都是为了安全.我觉得这很烦人,因为我有一套标准密码,通常不符合这些特殊规则,所以我必须制作并记住一个新密码.
如果您担心用户的密码有多复杂,似乎在安全性方面需要担心更重要的事情.如果某人实际上可以获得该密码,那么您显然需要担心更大的问题.在依赖用户担心您的安全性之前,请尽职尽责并锁定系统的末端.
我的实际问题是:这些复杂的密码规则有哪些替代方案可以降低彩虹表或暴力反转的风险,而不依赖于用户承担记忆复杂事情的重量?
一些想法:腌制,......
对于强大的,唯一的(不用于用户的其他应用程序)密码,密码的密码是否有任何好处?
Salting(我知道)可以防止使用字典或常用密码生成彩虹表.它还可以防止攻击者在另一个应用程序中注意到具有相同哈希的用户.
看起来像一个强密码(可能)不会出现在生成的彩虹表上,智能用户会为他想要保护的每个应用程序使用唯一的密码,盐水保护已经"聪明"的用户?
这是理论上的.我没有兴趣停止腌制.
从本质上讲,盐不会成为密码的一部分吗?它恰好由网守而不是用户提供.
我正在使用salt来加密用户的密码.我正在使用PHP,这里是用户注册期间发生的事情的快速示例.
这里是:
PHP代码:
// Gives me my random key. My salt generator.
$salt = uniqid(mt_rand());
// My password via what users inputs.
$userpwd;
// Then the encryption. I use a HMAC hash.
$encrypted = hmac_hash("sha256", $userpwd, $salt);
?>
Run Code Online (Sandbox Code Playgroud)
现在这一切都适合我的脚本.但我的问题是,如何验证用户登录?新的加密密码是随机的,因此我无法将登录表单中的密码与数据库中保存的加密密码进行比较.
我搜索过,无法找到解决方案.也许我没有足够的搜索,但有没有办法解密密码?如何使用我的脚本对用户进行身份验证?
这两种生成顺序但有些独特数字的方法之间的主要区别是什么?我想在MySQL数据库中使用这样一个数字作为唯一的用户ID,也可以作为盐来密码.
我的理解是,对于聚类和索引的原因,这些ID应该是顺序的(我意识到在某些情况下,随机字符串将使两个条目在相同的微秒内非顺序发生,但希望这可以忽略不计.)
我一直在阅读一些关于安全性的内容,我现在才开始尝试使用代码.我想用盐加MD5加密.我用随机盐跑了这个漂亮的PHP脚本:
substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',5)),0,10);
Run Code Online (Sandbox Code Playgroud)
它随机生成一些字符作为盐,但后来我想:我将如何检查登录?我是否要删除盐,还是应该将其存储在数据库中?