Security 密码学:为密码创建更强的哈希

Security 密码学:为密码创建更强的哈希,security,hash,passwords,cryptography,system,Security,Hash,Passwords,Cryptography,System,我正在开发一个基于web和客户端应用程序的系统;其中,客户端在PHP和Http请求的帮助下在服务器中进行所有数据库查询。web系统是用PHP/Mysql开发的,安装在PC上的客户端应用程序是用C#开发的 好!!在一个阶段中,客户机必须通过登录来识别用户,这看起来像是一个简单的任务,但是可以通过应用程序配置部分更改服务器IP。考虑到这一点,任何邪恶的人都可以通过输入一个邪恶的服务器ip地址,然后窃取密码来进行钓鱼,问题是,我不会以文本/普通的方式从客户端发送密码 现在我使用md5进行密码散列(不含

我正在开发一个基于web和客户端应用程序的系统;其中,客户端在PHP和Http请求的帮助下在服务器中进行所有数据库查询。web系统是用PHP/Mysql开发的,安装在PC上的客户端应用程序是用C#开发的

好!!在一个阶段中,客户机必须通过登录来识别用户,这看起来像是一个简单的任务,但是可以通过应用程序配置部分更改服务器IP。考虑到这一点,任何邪恶的人都可以通过输入一个邪恶的服务器ip地址,然后窃取密码来进行钓鱼,问题是,我不会以文本/普通的方式从客户端发送密码

现在我使用md5进行密码散列(不含盐,只是纯粹的散列),我只使用它将密码存储在数据库中

读了一点之后,我意识到人们不再推荐使用md5,而是使用sha256或更高版本,我正在考虑迁移到更好的散列算法并创建自己的salt

据我所知,salt只是你添加到散列中的一段随机文本,但我认为这不是最好的选择,所以我想:

由于散列是基于固定长度的小写十六进制值(32、64等,取决于算法),因此我可以使用散列中每个字符的每个ASCII码以及加载在列表(数组)中的固定值之和,例如:

我有:abcd

每个字母的ASCII码:

a->97

b->98

c->99

d->100

然后我对列表中的一个固定值求和(长度取决于32/64个整数),如下所示

a->97+5=102=>f

b->98+2=100=>d

c->99+7=106=>j

d->100+3=103=>g

因此结果将是:fdje,它取代了abcd的散列

我不知道这有多安全,黑客确定我使用的技术有多困难,问题是结果与散列长度相同,更难确定盐,因此,如果出于历史上的任何原因,黑客使用彩虹表并捕获可能的结果,这将是错误的。你觉得怎么样


谢谢…

简单的替换密码不太可能在很长一段时间内减慢一个坚定的黑客的速度

您最大的问题是,客户机中的某个人可能会建立一个您为特定值生成的哈希表。在密码字段中输入
a
,捕获散列。在密码字段中输入
b
,捕获散列。有了这样的数据,就很容易对方法进行反向工程,即使它是盐渍的

我认为最好的办法是使用某种公钥/私钥对,这样客户端只信任您的服务器,而不会与其他任何东西通信

我还认为您误解了salting-您没有将字符添加到散列中,而是将它们添加到正在散列的值中。想想
hash(密码+盐)
而不是
hash(密码)

可以使用应用程序配置部分更改服务器IP。考虑到这一点,任何邪恶的人都可以通过输入邪恶的服务器ip地址,然后窃取密码来进行网络钓鱼

作为威胁模型,这没有意义。如果攻击者可以在客户端上执行代码来重新配置用户的应用程序,那么他们就可以在接近服务器之前拦截所有击键

问题是,我不会以文本/纯文本形式从客户端发送密码

保护连接的正常方法是使用SSL,这样就可以将密码从客户端发送到服务器。必要的服务器证书还将负责向客户机验证服务器(尽管这仍然无法修复受损客户机端点的问题)。如果你不想支付商业CA的费用,你可以使用你自己的CA基础设施

如果您建议将哈希值从客户端传递到服务器,而不是密码,那么您就得到了一个与密码等效的哈希值,如果该哈希值被泄露,将面临许多与密码相同的风险。此外,这意味着客户端和服务器必须就哈希算法达成一致,因此不能包含salt,这意味着您仍然可以在服务器数据库中轻松存储可破解的非salt哈希

在十六进制编码的散列中的数字上运行固定替换密码将提供非常小的模糊性,这将只阻止最懒惰的攻击者。我认为,当人们熟知的标准安全系统提供更好的保证时,就不值得费心了:HTTPS用于连接,bcrypt(在PHP中)用于密码存储


(如果你真的需要连接到一个你不信任的服务器,有PAKE算法,但这是一堆工作,留下了如何设置和管理密码的问题,没有连接层加密,整个协议的其余部分都是不受保护的。)您可能误解了密码的含义。satting密码用于“防御”彩虹表(彩虹表是预先计算值的大表)。现在,生成彩虹表一次是黑客必须做的最昂贵的操作,彩虹表的整个概念是加速暴力强制哈希

散列的目的是消除为一个密码生成一个散列表/彩虹表,然后用于另一个密码的可能性。假设您有一个固定的盐生成算法,任何攻击者都可以确定该算法并对您使用它

盐应随机生成,并以明文形式存储在密码本身的某个位置。salt对于每个密码也应该是唯一的(如果您使用适当的随机salt生成器,这应该得到很好的保证)。通过这样做,您可以确保为一个pas创建一个彩虹表
$pass = 'foobar';

//Generates a password hash
$hash = password_hash($pass, PASSWORD_DEFAULT);
$pass_to_verify = ...

//$hash variable retrieved from the previous password_hash() function.
if(password_verify($pass_to_verify, $hash)){
    //Password is correct
}else{
    //Password is not correct
}