import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Arrays;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
public class PasswordEncryptionService {
public boolean authenticate(String attemptedPassword,
byte[] encryptedPassword, byte[] salt)
throws NoSuchAlgorithmException, InvalidKeySpecException {
// Encrypt the clear-text password using the same salt that was used to
// encrypt the original password
byte[] encryptedAttemptedPassword = getEncryptedPassword(
attemptedPassword, salt);
// Authentication succeeds if encrypted password that the user entered
// is equal to the stored hash
return Arrays.equals(encryptedPassword, encryptedAttemptedPassword);
}
public byte[] getEncryptedPassword(String password, byte[] salt)
throws NoSuchAlgorithmException, InvalidKeySpecException {
// PBKDF2 with SHA-1 as the hashing algorithm. Note that the NIST
// specifically names SHA-1 as an acceptable hashing algorithm for
// PBKDF2
String algorithm = "PBKDF2WithHmacSHA1";
// SHA-1 generates 160 bit hashes, so that's what makes sense here
int derivedKeyLength = 160;
// Pick an iteration count that works for you. The NIST recommends at
// least 1,000 iterations:
// http://csrc.nist.gov/publications/nistpubs/800-132/nist-sp800-132.pdf
// iOS 4.x reportedly uses 10,000:
// http://blog.crackpassword.com/2010/09/smartphone-forensics-cracking-blackberry-backup-passwords/
int iterations = 20000;
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterations,
derivedKeyLength);
SecretKeyFactory f = SecretKeyFactory.getInstance(algorithm);
return f.generateSecret(spec).getEncoded();
}
public byte[] generateSalt() throws NoSuchAlgorithmException {
// VERY important to use SecureRandom instead of just Random
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
// Generate a 8 byte (64 bit) salt as recommended by RSA PKCS5
byte[] salt = new byte[8];
random.nextBytes(salt);
return salt;
}
}
public static void main(String[] args) {
PasswordEncryptionService passwordEncryptionService = new PasswordEncryptionService();
String password = "testTest";
try {
//生成salt,可保存到数据库用于验证
byte[] salt = passwordEncryptionService.generateSalt();
//根据salt加密的密码,可保存到数据库用于验证
byte[] encryptedPassword = passwordEncryptionService.getEncryptedPassword(password, salt);
//验证密码,根据上面保存的salt,encryptedPassword进行密码验证
boolean bl = passwordEncryptionService.authenticate(password, encryptedPassword, salt);
System.out.println(bl);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeySpecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
分享到:
相关推荐
总之,"proxool连接池用户名密码加密"是一个重要的安全实践,通过加密数据库连接的凭证,我们可以提高系统的安全性,保护数据免受未经授权的访问。正确地配置和使用这个功能,可以确保在享受数据库连接池带来的性能...
SYD8801 密码加密 配对SYD8801 密码加密 配对SYD8801 密码加密 配对SYD8801 密码加密 配对SYD8801 密码加密 配对
在IT行业中,密码的安全性是至关重要的,尤其是在网络服务中,如用户登录...总的来说,MD5在Java中的使用提供了一种简单的密码加密方式,但随着技术的发展,开发者应考虑使用更强大的加密策略来保护用户的敏感信息。
### AIX 密码加密方式详解 #### 一、AIX密码加密机制概述 AIX(Advanced Interactive Executive)是IBM公司开发的一种Unix操作系统,广泛应用于各种服务器环境。随着网络安全需求的不断提高,AIX系统提供了多种密码...
### Spring Boot 整合 Druid 实现数据库密码加密 #### 一、引言 在实际的生产环境中,数据库的安全性非常重要,尤其是数据库连接信息中的用户名和密码。为了防止这些敏感信息被泄露,通常需要采取措施来保护这些...
在SQLite中,为了保护数据库文件不被未经授权的访问,可以对.db文件设置密码加密。 **SQLite数据库加密** SQLite提供了一种内置的加密机制,允许我们为.db文件设置密码,确保数据在传输和存储时的安全。这种加密...
在实际开发中,除了密码加密,还应考虑使用HTTPS协议传输数据,以及在服务器端进行输入验证,防止SQL注入等攻击。同时,定期更新密码策略,限制密码的复杂性和生命周期,也是保护用户信息安全的重要措施。
标题"druid实现springmvc数据库连接的用户名和密码加密"指出,我们要讨论的是如何在Spring MVC项目中利用Druid连接池进行更高级别的安全性配置,即对数据库连接的敏感信息进行加密。这通常涉及以下步骤: 1. **密码...
仿射密码加密与解密C++源程序 仿射密码是一种简单的加密算法,它使用线性变换来进行加密和解密。下面我们将详细介绍仿射密码的加密和解密算法,并提供相应的C++源代码。 仿射密码的加密算法是一个线性算法,密钥...
密码加密存储方法 密码安全是信息安全的根本,直接存储密码到数据库是极不安全的,因为一旦别人入侵了你的机器或别人有机会用你的电脑,那数据库中的密码就非常容易被别人获得。因此,为了保证用户的密码安全,我们...
Tomcat 配置文件数据库密码加密,增加factory属性和修改context.xml文件中密码为密文,在lib文件中添加自定义的factory类 代码是jdk1.8版本,包含简单的加密类和http请求,如果使用简单的加密,不需要引用额外的lib...
### Tomcat连接池数据库密码加密解密方法详解 在企业级应用中,数据库的安全性尤为重要。其中,数据库连接池作为应用程序与数据库之间的桥梁,扮演着关键角色。然而,当数据库的用户名和密码直接硬编码在配置文件...
本文将详细介绍两种密码加密的方法,以帮助开发者更好地理解和应用Spring Boot框架。 1. 为什么要加密密码 在2011年的CSDN用户数据泄露事件中,大量用户的明文密码被曝光,揭示了明文存储密码的严重风险。由于许多...
在这个项目中,我们看到的是使用HTML和JavaScript实现的凯撒密码加密与解密工具。HTML负责构建用户界面,而JavaScript则处理加密和解密的逻辑。这是一个很好的实践案例,可以帮助学习者理解基本的加密概念,并熟悉...
在Druid 1.0.9版本中,为了增强数据库连接的安全性,引入了密码加密的功能。这个功能允许开发者将数据库的用户名和密码加密,从而在配置文件中安全地存储这些敏感信息,避免明文密码泄露带来的风险。 首先,我们...
综上所述,易语言编写的QQ密码加密器为用户提供了便捷的密码加密方式,使得密码安全保护变得更加普及和容易。然而,无论使用何种工具,用户都应具备必要的安全意识,了解工具的工作原理,并采取正确的措施来保护自己...
为了使用这个"栅栏密码加密解密工具",你需要熟悉加密和解密的过程,以及可能遇到的挑战,如不均匀的文本长度和未知的栅栏数。通过实践和实验,你可以更好地掌握这种方法,并在需要时应用到实际的加密和解密任务中。...
在Caesar密码的压缩包文件中,"Caesar"可能是程序源代码文件的名字,里面包含了实现Caesar密码加密解密功能的Java源代码。通过阅读和理解这个源代码,我们可以学习到如何在实际编程中应用基础的加密解密原理,以及...
在标题提到的"rdp文件中的密码加密解密程序"是一种工具,专门设计用来处理RDP文件中的密码加密和解密。当RDP文件中包含`username:s:xxxx`和`password 51:b:xxxxx`这样的条目时,`xxxxx`部分就是经过加密的密码。这个...
因此,"web应用数据库密码加密"成为了一个必要的实践。 1. **Spring Boot/Spring 中的数据库密码加密** Spring Boot和Spring框架默认使用YAML或Properties文件来配置数据库连接信息,包括用户名和密码。为了保护...