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))回网站.
在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)
然后,即使黑客窃取您的数据库,密码也不可读.
| 归档时间: |
|
| 查看次数: |
18216 次 |
| 最近记录: |