作为盐只是一个随机字符串添加到您要编码的字符串的哈希值,有足够的方法来生成它[例如this on SO ]。
您不需要也无法解密任何 sha 结果,因为 sha [like md5] 是一种散列算法,而不是crypt函数,即它并不意味着隐藏任何内容以供以后检索:这很重要,因为我不想要我注册的网站的管理员可以从数据库中读取我的密码。
散列是将一个数据集中的元素映射到另一个数据集中的较短元素,以一种 [几乎完全] 单射的方式- 您将任意长字符串映射到固定长度的键:这使您可以在散列域中进行比较,而无需实际知道原值。
hash( value1 ) = hash ( value2 ) => value1 = value2
我说几乎是因为散列算法有一些冲突[例如,先前声明的例外,例如hash(value1) = hash(value2)
并不意味着 2 个值相同] - 盐在这方面也有帮助。
这就是说,这是您将密码保存到 db 的方式:
- 生成盐;
- 将盐添加到实际密码中:将其放在密码之前以防止字典攻击很重要;
- 用适当的算法对连接的字符串进行哈希
sha1
处理[我只是为了举例而选择的];
- 将字符串和盐都保存到数据库中。
在代码中:
$user -> salt = your_salt_generator();
$user -> hashedPwd = hash('sha1', $salt . $userChosenPwd);
Pwd 检查$username
/$password
只是:
$username
从数据库中获取用户;
- 如果存在,请使用上面保存的盐和给定密码的过程,并检查它是否等于存储的哈希。
在代码中:
hash('sha1', $user -> salt . $sentPassword) == $user -> hashedPwd;
关于在 URL 中隐藏值,它更像是一个 SEO / 可读性主题而不是安全主题:应该在路由时创建 URL [例如http://somesite.com/products/:id
访问第 id 产品],并且您的服务器逻辑不应该容易受到放入请求中的内容的影响制作到您的网站[不管我现在无法提供的完全废话]。
关于 MySQL 注入,我们摆脱了它们,因为PDO扩展的预处理语句。
SO周围有数百万个关于这个的答案,看看周围。
跟上您的工作!