安全漏洞比以往任何时候都更为普遍,密码通常是链中最弱的链接。攻击者经常使用蛮力攻击,字典攻击和其他方法来破解密码。因此,必须确保密码牢固地存储并且不能轻易折衷。
[2
1.1密码安全性差的风险
有几种强大的技术可以在数据库中保护用户密码。以下各节详细介绍了这些技术,以及代码示例,演示和结果。
腌制是在放哈密码之前将随机数据添加到密码的过程。该技术可确保即使两个用户具有相同的密码,它们的哈希值也会有所不同,从而使攻击者更难使用预先计算的哈希表(彩虹表)进行攻击。
导入java.security.securerandom;
导入java.security.messagedigest;
导入java.util.base64;
公共类密码安全{
私有静态最终字符串salt_algorithm =“ sha1prng”;
私有静态最终字符串hash_algorithm =“ sha-256”;
public static String生成()引发异常{
Securerandom Sr = SecureRandom.getInstance(SALT_ALGORITHM);
字节[]盐=新字节[16];
sr.nextbytes(盐);
返回base64.getEncoder()。编码(盐);
}
公共静态字符串HashPassword(字符串密码,字符串盐)抛出异常{
MessageDigest md = messagedigest.getInstance(hash_algorithm);
md.update(salt.getBytes());
byte [] hashedpassword = md.digest(password.getBytes());
返回base64.getEncoder()。encodeString(HashedPassword);
}
public static void main(string [] args)抛出异常{
字符串盐= generatesAlt();
字符串hashedpassword = hashpassword(“ mySecurePassword123”,盐);
system.out.println(“盐:”盐);
system.out.println(“哈希密码:” HashedPassword);
}
}
输出显示了一个唯一的盐和一个哈希密码,这清楚地表明,由于盐的不同,即使相同的密码也会具有不同的哈希。
2.2使用自适应哈希算法(bcrypt,scrypt,argon2)
[2
import java.security.SecureRandom; import java.security.MessageDigest; import java.util.Base64; public class PasswordSecurity { private static final String SALT_ALGORITHM = "SHA1PRNG"; private static final String HASH_ALGORITHM = "SHA-256"; public static String generateSalt() throws Exception { SecureRandom sr = SecureRandom.getInstance(SALT_ALGORITHM); byte[] salt = new byte[16]; sr.nextBytes(salt); return Base64.getEncoder().encodeToString(salt); } public static String hashPassword(String password, String salt) throws Exception { MessageDigest md = MessageDigest.getInstance(HASH_ALGORITHM); md.update(salt.getBytes()); byte[] hashedPassword = md.digest(password.getBytes()); return Base64.getEncoder().encodeToString(hashedPassword); } public static void main(String[] args) throws Exception { String salt = generateSalt(); String hashedPassword = hashPassword("mySecurePassword123", salt); System.out.println("Salt: " salt); System.out.println("Hashed Password: " hashedPassword); } }
args){ 字符串hashed = hashpassword(“ mySecurePassword123”); system.out.println(“哈希密码:”哈希); boolean isMatch = checkpassword(“ mySecurePassword123”,Hashed); system.out.println(“密码匹配:” isMatch); } }
2.3胡椒:额外的安全层
[2
使用安全的随机生成器生成胡椒键。
在哈希之前将胡椒添加到盐密码上。
import org.mindrot.jbcrypt.BCrypt; public class BCryptExample { public static String hashPassword(String plainPassword) { return BCrypt.hashpw(plainPassword, BCrypt.gensalt(12)); } public static boolean checkPassword(String plainPassword, String hashedPassword) { return BCrypt.checkpw(plainPassword, hashedPassword); } public static void main(String[] args) { String hashed = hashPassword("mySecurePassword123"); System.out.println("Hashed Password: " hashed); boolean isMatch = checkPassword("mySecurePassword123", hashed); System.out.println("Password Match: " isMatch); } }即使使用强烈的散列和盐水,蛮力攻击仍然是一个威胁。实施利率限制(例如,限制登录尝试的数量)和帐户锁定机制有助于降低这些风险。
[2
3。保护密码的最佳实践
使用强壮的盐和辣椒
盐应为每个密码输入唯一,并使用安全的随机数生成器生成。胡椒应牢固地存储,并且从未在源代码中进行硬编码。
定期更新您的哈希算法想了解更多或有问题?随时在下面发表评论!
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3