我想生成一个随机的salt值并将其置于Application状态.
现在,我正在使用Web场,因此每台计算机的应用程序状态将不同.我也不想购买分布式状态农场应用程序.
那么..有什么解决方案呢?我以为我可以在代码或web.config文件中对其进行硬编码..但这意味着eva的相同盐...不是很安全.
有人有什么建议吗?
记住 - 我在所有机器上都使用了一个独特的键(例如guid).也许配置文件是唯一的方法?
关于盐和最佳实践存在很多问题,但是大多数问题只是回答有关它们的非常具体的问题.我有几个相互提问的问题.
假设数据库被泄露,每用户盐阻止使用通用彩虹表来破解密码.必须为每个拥有唯一盐的用户生成单独的彩虹表以获取其密码.这将是一个耗时的过程,这使得盐有效.这对字典或暴力攻击无济于事.
这导致了许多问题:
先感谢您.
我用盐创造了一种盐; MD5(兰特(0,10000000)); (可能有更好的方法?)
似乎没有可能在MYSQL中使文本字段唯一.那么如何检查盐是否已用于以前的用户?
或者我应该根据当前日期/时间生成盐?因为2个用户不可能在完全相同的时间注册正确吗?
我对哈希密码和盐值有所了解.因为我对哈希和加密很新,我想我会把它发给你.为每个用户帐户生成唯一的盐是否更安全,然后在数据库中存储salt和散列值?或者,保持一个盐值安全存储并重新使用每次我输入密码?
例如,用户将使用密码:
"secret"
Run Code Online (Sandbox Code Playgroud)
我的代码会生成一个salt值:
"d1d0e3d4b3d1ed1598a4e77bb614750a2a175e"
Run Code Online (Sandbox Code Playgroud)
然后哈希结果得到:
"e8187dcbe8e2eabd4675f3a345fe21c98affb
5544a9278461535cb67265b6fe09a11dbef572
ce3a4a8f2275839927625cf0bc7bc46fc45d51
12d7c0713bb4a3"
Run Code Online (Sandbox Code Playgroud)
然后,在创建帐户时,散列结果和salt将存储在用户配置文件的数据库中.然后,每次用户登录时,都会生成一个新的盐,密码和盐重新存储并存储在数据库中.
有什么想法吗?就像我说的,这是对我的想法的理智检查.
这看起来像是一个安全的盐与密码一起使用?任何改进或建议或明显的缺陷?
$salt = '';
for ($i = 0; $i < 50; $i++) {
$salt .= chr(rand(33, 126));
}
Run Code Online (Sandbox Code Playgroud) 我最近开始设置PureFTP服务器的任务.在工作中我们使用Postgresql 8.4.架构基本上归结为,
username text
password character(40)
password_salt text
Run Code Online (Sandbox Code Playgroud)
该password存储为哈希sha1( password + salt ).使用Postgresql的pgcrypto我可以提供一个username,password并找出用户是否有auth:
SELECT
encode( digest( $password ||password_salt, 'sha1' ), 'hex' ) = password
AS password_correct
, username
, password
, password_salt
FROM contact.person;
Run Code Online (Sandbox Code Playgroud)
现在我遇到的问题是这样的功能需要我将密码输入查询.Pureftp目前的auth-postgresql实现似乎不太可行.它仅支持提供:
\L is replaced by the login of a user trying to authenticate.
\I is replaced by the IP address the client connected to.
\P is replaced by the port number the client connected to.
\R is replaced …Run Code Online (Sandbox Code Playgroud) 我有一个使用crypt()的问题,如果用户有密码(本例中为password1),并且将其更改为password2,则哈希返回相同的结果.您可以在此处测试:OLD LINK 键入password1作为当前密码,password2作为新密码并确认密码,您将看到结果.如果输入完全不相似的密码,则没有问题.我知道还有其他方法可以使用哈希密码等.我比任何事都更好奇.我的代码如下:
<?php
$oldpassword="password1";
echo "<form method=\"post\">
<p>Enter Current Password: <input type=\"password\" name=\"currentpassword\" /></p>
<p>Enter New Password: <input type=\"password\" name=\"password\" /></p>
<p>Confirm New Password: <input type=\"password\" name=\"confirmpassword\" /></p>
<p><input type=\"submit\" value=\"Change Password\"></p>
</form>";
$user_id = $_SESSION['user_id'];
$pass=$_POST['password'];
$salt = 'xxxxx';
$currentpassword = crypt($_POST['currentpassword'], $salt);
$oldpassword = crypt($oldpassword, $salt);
if(isset($_POST['password'])) {
if ($currentpassword !== $oldpassword) {
echo "The password you entered for current password does not match our records.";
}
else {
if ($_POST['password'] && $_POST['confirmpassword']) {
if ($_POST['password'] …Run Code Online (Sandbox Code Playgroud) 所以我正在试验bcrypt.我有一个类(如下所示,我从http://www.firedartstudios.com/articles/read/php-security-how-to-safely-store-your-passwords获得),其中有3个函数.第一个是生成随机Salt,第二个是使用第一个生成的Salt生成哈希,最后一个是通过将其与哈希密码进行比较来验证提供的密码.
<?php
/* Bcrypt Example */
class bcrypt {
private $rounds;
public function __construct($rounds = 12) {
if(CRYPT_BLOWFISH != 1) {
throw new Exception("Bcrypt is not supported on this server, please see the following to learn more: http://php.net/crypt");
}
$this->rounds = $rounds;
}
/* Gen Salt */
public function genSalt() {
/* openssl_random_pseudo_bytes(16) Fallback */
$seed = '';
for($i = 0; $i < 16; $i++) {
$seed .= chr(mt_rand(0, 255));
}
/* GenSalt */
$salt = substr(strtr(base64_encode($seed), '+', …Run Code Online (Sandbox Code Playgroud) 我想我在这里缺少一些关键的东西.在CPasswordHelper::hashPassword函数中我们有行:
$salt=self::generateSalt($cost);
$hash=crypt($password,$salt);
return $hash;
Run Code Online (Sandbox Code Playgroud)
在CPasswordHelper::verifyPassword这条线上:
$test=crypt($password,$hash);
return self::same($test, $hash);
Run Code Online (Sandbox Code Playgroud)
盐怎么样?根据我的理解,它甚至没有保留,但它没有任何意义,所以我猜我完全不理解它.
我使用crypt()来哈希密码,像这样的河豚盐:
[a-zA-Z0-9] $ 2a $,2位数,$,21个字符
在这里我犯了一个错误,在第三个$ 21之后的字符长度不是22.但它工作正常所以我没有找到错误.
它适用于运行Windows和PHP 5.4.4的桌面以及使用php 5.3.x运行Amazon linux的AWS ec2,其中包含太短的盐.
有一天,我将AWS php更新为5.5.14.然后问题发生了.crypt()一直返回*0.
经过一番尝试,我在盐的末尾加了一个$,所以它变成22个字符.它再次工作并返回与以前相同的哈希字符串.虽然它不遵守河豚规则,但字符应为[./a-zA-Z0-9]
但是现在我将这个站点复制到另一台运行openSuSE 13.1和php 5.5.14的机器上,这个盐再次失败了.
我将php降级到5.4.20,但没有帮助.
新站点仍然需要旧数据库,所以我必须使密码哈希工作.
什么是影响此河豚盐长度错误兼容性问题的库或模块?Tt似乎不是PHP的版本.AWS 5.5.14
或者是否有另一个神奇的咒语可以再次救我?我尝试在[./a-zA-Z0-9]中为每个替换尾部$但是没有幸运,哈希字符串是不同的....