哈希和腌制价值观

Ava*_*nst 9 java hash cryptography

我正在开发一个内部验证用户身份的小型Web应用程序.一旦用户通过身份验证,我的Web应用程序就会将一些信息(如userID和Person的名称)传递给第三方Web应用程序.第三方开发人员建议我们对值进行散列和加盐.

原谅我的无知,但究竟是什么意思呢?

我正在用Java编写应用程序.所以我打算做的是将userID,Person的名称和一些Math.random()值作为Apache Commons Digest Utils SHA512的哈希值并将该哈希字符串与userID和person的名称一起传递.

这是标准做法吗?我应该通过第三方盐也是正确的?

Mar*_*arc 14

盐通常用于安全地存储密码的哈希值.散列用于存储或通信的密码(以便其他人无法读取)很容易通过使用彩虹表进行解码.现在,当您向密码添加随机字符串,但使用散列存储字符串时,这变得更加困难.计算这个新哈希看起来像:

hash(password + salt)
Run Code Online (Sandbox Code Playgroud)

甚至

hash(hash(password) + salt)
Run Code Online (Sandbox Code Playgroud)

要安全地登录第三方网站,可以发送UserID,盐渍哈希(从上面)和您使用的盐(如果没有给出).根据网站存储密码的方式,您可以为自己生成盐,也可以从中获取盐.

一种选择是首先将UserID发送到网站,然后让它用盐响应,然后将其发送hash(password+salt))回网站.

  • @Coronatus:哈希的输出是随机字节,而不是'字母/数字'.没有明显减弱. (3认同)

Amy*_*y B 8

在Java中,您可以执行以下操作:

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.RandomStringUtils;

/**
 * SHA1-hash the password with the user's salt.
 *
 * @param password
 */
public void setPassword(String password)
{
    if (password.equals(this.password))
    {
        return;
    }

    if (passwordSalt == null || passwordSalt.equals(""))
    {
        passwordSalt = RandomStringUtils.randomAscii(20);
    }

    this.password = DigestUtils.shaHex(password + passwordSalt);
}

/**
 * Check if a given password is correct.
 *
 * @param givenPassword
 * @return True is correct, else false.
 */
public boolean checkPassword(String givenPassword)
{
    return (password.equals(DigestUtils.shaHex(givenPassword + passwordSalt)));
}
Run Code Online (Sandbox Code Playgroud)

然后,即使黑客窃取您的数据库,密码也不可读.