第九站:Java黑——安全编码的结实防线(第②篇)

打印 上一主题 下一主题

主题 1759|帖子 1759|积分 5277

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
4. 验证和过滤输入数据示例:利用Apache Commons Lang

对输入数据进行验证和过滤是防止多种安全弊端的关键步骤,包括但不限于SQL注入和下令注入。Apache Commons Lang库提供了一些实用方法来帮助进行字符串操作和验证。以下是一个简朴的示例,展示怎样利用它来检查输入是否只包含数字和字母,从而防止不安全的字符输入:
首先,确保你的项目中已经包含了Apache Commons Lang库。假如是Maven项目,在pom.xml中参加以下依赖:
  1. <dependency>
  2.     <groupId>org.apache.commons</groupId>
  3.     <artifactId>commons-lang3</artifactId>
  4.     <version>3.12.0</version>
  5. </dependency>
复制代码
然后,利用其提供的方法来验证用户输入:
  1. import org.apache.commons.lang3.StringUtils;
  2. public class InputValidationExample {
  3.     public static void main(String[] args) {
  4.         String userInput = "HelloWorld123";
  5.         
  6.         if (StringUtils.isAlphanumeric(userInput)) {
  7.             System.out.println("The input is valid.");
  8.         } else {
  9.             System.out.println("The input contains invalid characters.");
  10.         }
  11.     }
  12. }
复制代码
5. 利用Spring Security进行身份验证和授权

Spring Security是一个强盛的安全框架,用于处理认证(验证用户身份)和授权(控制用户访问资源的权限)。以下是一个基本的Spring Security设置示例,展示了怎样设置基本的表单登录和权限控制:
首先,确保你的项目中包含了Spring Security依赖。对于Maven项目:
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-security</artifactId>
  4. </dependency>
复制代码
接着,设置Spring Security。在Spring Boot应用中,你可以在application.yml或application.properties中进行基本设置,或者创建一个Java设置类,比方:
  1. @Configuration
  2. @EnableWebSecurity
  3. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  4.     @Override
  5.     protected void configure(HttpSecurity http) throws Exception {
  6.         http.authorizeRequests()
  7.             .antMatchers("/resources/**", "/signup", "/about").permitAll() // 公开资源
  8.             .antMatchers("/admin/**").hasRole("ADMIN") // 管理员角色才能访问
  9.             .anyRequest().authenticated() // 其他请求需要认证
  10.             .and()
  11.             .formLogin(); // 启用表单登录
  12.     }
  13.     // 配置用户详细信息服务等其他安全设置...
  14. }
复制代码
6. 利用HTTPS和SSL/TLS进行安全通讯

在Java Web应用中,利用HTTPS协媾和SSL/TLS证书可以确保数据在传输过程中的安全。以下是一个基于Spring Boot设置HTTPS毗连的简要示例:
首先,你需要一个SSL证书。这可以通过购买或利用自签名证书进行测试。假设你的证书和私钥文件名为server.crt和server.key,你可以如许设置Spring Boot:
在application.properties或application.yml中:
  1. server:
  2.   port: 8443
  3.   ssl:
  4.     enabled: true
  5.     key-store:classpath:server.p12 # 如果是PKCS12格式的密钥库
  6.     key-store-password: yourKeystorePassword
  7.     keyStoreType: PKCS12 # 根据你的密钥库类型调整
  8.     keyAlias: tomcat # 密钥别名
复制代码
或者,假如你直接利用.key和.crt文件:
  1. server:
  2.   port: 8443
  3.   ssl:
  4.     enabled: true
  5.     key-store-type: PEM
  6.     key-store:classpath:server.key
  7.     key-password: yourPrivateKeyPassword
  8.     trust-store:classpath:server.crt
复制代码
确保你的密钥和证书文件被正确地放置在项目的类路径下,并且密码正确无误。
通过这些额外的示例,我们可以看到,从数据验证、框架集成到网络通讯安全,Java应用的每个层面都需要仔细考虑和设置,以构建一个全面安全的应用环境。
7. 利用Shiro进行权限控制与会话管理

Apache Shiro是一个强盛且易用的安全框架,它简化了身份验证、授权、会话管理和加密等功能的实现。以下是一个基础的Shiro设置示例,展示了怎样进行用户身份验证及角色权限控制:
首先,确保你的项目中包含了Shiro的依赖。对于Maven项目:
  1. <dependency>
  2.     <groupId>org.apache.shiro</groupId>
  3.     <artifactId>shiro-spring</artifactId>
  4.     <version>1.9.0</version>
  5. </dependency>
复制代码
接着,设置Shiro。在Spring应用上下文中界说Shiro的设置类:
  1. @Configuration
  2. public class ShiroConfig {
  3.     @Bean
  4.     public SecurityManager securityManager(Realm realm) {
  5.         DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
  6.         securityManager.setRealm(realm);
  7.         return securityManager;
  8.     }
  9.     @Bean
  10.     public Realm realm() {
  11.         // 这里可以配置自己的Realm,用于认证和授权逻辑
  12.         return new IniRealm("classpath:shiro.ini");
  13.     }
  14.     @Bean
  15.     public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
  16.         ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
  17.         factoryBean.setSecurityManager(securityManager);
  18.         Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
  19.         filterChainDefinitionMap.put("/login", "anon"); // 登录页面匿名访问
  20.         filterChainDefinitionMap.put("/logout", "logout"); // 注销操作
  21.         filterChainDefinitionMap.put("/**", "authc"); // 其他请求需要认证
  22.         factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
  23.         return factoryBean;
  24.     }
  25. }
复制代码
同时,你需要一个设置文件(如shiro.ini)来界说用户、角色和权限:
  1. [users]
  2. admin = password, admin
  3. guest = guest, user
  4. [roles]
  5. admin = *
  6. user = read, write
  7. guest = read
复制代码
8. 利用HMAC进行消息完整性验证

HMAC(Hash-based Message Authentication Code)是一种利用哈希函数和密钥来验证消息完整性的方法。在Java中,可以利用java.security包来实现。以下是一个简朴的HMAC天生和验证示例:
  1. import javax.crypto.Mac;
  2. import javax.crypto.spec.SecretKeySpec;
  3. import java.nio.charset.StandardCharsets;
  4. import java.security.InvalidKeyException;
  5. import java.security.NoSuchAlgorithmException;
  6. import java.util.Base64;
  7. public class HMACExample {
  8.     public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException {
  9.         String message = "This is a secret message.";
  10.         String key = "MySuperSecretKey";
  11.         // 生成HMAC
  12.         String hmac = generateHMAC(message, key);
  13.         System.out.println("Generated HMAC: " + hmac);
  14.         // 验证HMAC
  15.         boolean isValid = verifyHMAC(message, key, hmac);
  16.         System.out.println("HMAC Verification: " + isValid);
  17.     }
  18.     public static String generateHMAC(String data, String keyString) throws NoSuchAlgorithmException, InvalidKeyException {
  19.         SecretKeySpec keySpec = new SecretKeySpec(keyString.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
  20.         Mac mac = Mac.getInstance("HmacSHA256");
  21.         mac.init(keySpec);
  22.         byte[] hmacBytes = mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
  23.         return Base64.getEncoder().encodeToString(hmacBytes);
  24.     }
  25.     public static boolean verifyHMAC(String originalData, String keyString, String hmacToVerify) throws NoSuchAlgorithmException, InvalidKeyException {
  26.         String generatedHMAC = generateHMAC(originalData, keyString);
  27.         return generatedHMAC.equals(hmacToVerify);
  28.     }
  29. }
复制代码
9. 利用JWT(JSON Web Tokens)进行安全认证

JWT是一种常用的安全认证方式,它允许双方之间安全地传输信息。以下是一个简朴的JWT天生和验证示例,利用jjwt库:
首先,添加jjwt依赖到你的项目(Maven为例):
  1. <dependency>
  2.     <groupId>io.jsonwebtoken</groupId>
  3.     <artifactId>jjwt-api</artifactId>
  4.     <version>0.11.2</version>
  5. </dependency>
  6. <dependency>
  7.     <groupId>io.jsonwebtoken</groupId>
  8.     <artifactId>jjwt-impl</artifactId>
  9.     <version>0.11.2</version>
  10. </dependency>
  11. <dependency>
  12.     <groupId>io.jsonwebtoken</groupId>
  13.     <artifactId>jjwt-jackson</artifactId> <!-- 或 jjwt-gson 如果你使用Gson -->
  14.     <version>0.11.2</version>
  15. </dependency>
复制代码
然后,编写JWT的天生与验证代码:
  1. import io.jsonwebtoken.Jwts;
  2. import io.jsonwebtoken.SignatureAlgorithm;
  3. import io.jsonwebtoken.security.Keys;
  4. import javax.crypto.SecretKey;
  5. public class JWTExample {
  6.     public static void main(String[] args) {
  7.         // 生成密钥
  8.         SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
  9.         // 生成JWT
  10.         String jwt = Jwts.builder()
  11.                 .setSubject("Alice")
  12.                 .signWith(key)
  13.                 .compact();
  14.         System.out.println("Generated JWT: " + jwt);
  15.         // 验证JWT
  16.         try {
  17.             Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(jwt);
  18.             System.out.println("JWT Verification: Success");
  19.         } catch (Exception e) {
  20.             System.out.println("JWT Verification: Failed");
  21.         }
  22.     }
  23. }
复制代码
以上示例覆盖了权限控制、消息完整性验证以及今世Web应用中常用的JWT认证技术,进一步丰富了Java安全编码的实践案例。
10. 实现线程池管理

在Java中,ExecutorService接口和其相关实现类提供了创建和管理线程池的本领,这对于实行大量短期异步任务非常有用。下面是一个利用线程池实行任务并优雅关闭线程池的例子:
  1. import java.util.concurrent.ExecutorService;
  2. import java.util.concurrent.Executors;
  3. import java.util.concurrent.TimeUnit;
  4. public class ThreadPoolExample {
  5.     public static void main(String[] args) {
  6.         // 创建固定大小的线程池
  7.         ExecutorService executor = Executors.newFixedThreadPool(5);
  8.         // 提交任务到线程池执行
  9.         for (int i = 0; i < 10; i++) {
  10.             int taskId = i;
  11.             executor.submit(() -> {
  12.                 System.out.println("Task ID " + taskId + " is running by " + Thread.currentThread().getName());
  13.                 try {
  14.                     Thread.sleep(1000); // 模拟耗时操作
  15.                 } catch (InterruptedException e) {
  16.                     Thread.currentThread().interrupt();
  17.                     System.out.println("Thread interrupted: " + e.getMessage());
  18.                 }
  19.             });
  20.         }
  21.         // 关闭线程池,不再接受新任务,等待所有已提交的任务完成
  22.         executor.shutdown();
  23.         try {
  24.             // 等待直到所有任务完成,最多等待1分钟
  25.             if (!executor.awaitTermination(1, TimeUnit.MINUTES)) {
  26.                 executor.shutdownNow(); // 强制关闭,取消正在执行的任务
  27.                 System.out.println("ThreadPool did not terminate in time, forcing shutdown.");
  28.             } else {
  29.                 System.out.println("All tasks completed.");
  30.             }
  31.         } catch (InterruptedException e) {
  32.             executor.shutdownNow();
  33.             Thread.currentThread().interrupt();
  34.             System.out.println("Interrupted while waiting for tasks to complete.");
  35.         }
  36.     }
  37. }
复制代码
11. 利用CompletableFuture进行异步编程

CompletableFuture是Java 8引入的一个强盛的异步编程工具,它支持非壅闭式操作和链式调用。下面是一个简朴示例,展示了怎样利用CompletableFuture进行异步任务处理并组合结果:
  1. import java.util.concurrent.CompletableFuture;
  2. import java.util.concurrent.ExecutionException;
  3. public class CompletableFutureExample {
  4.     public static void main(String[] args) {
  5.         CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
  6.             simulateDelay(1000); // 模拟延迟
  7.             return "Hello";
  8.         });
  9.         CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
  10.             simulateDelay(2000); // 模拟延迟
  11.             return "World";
  12.         });
  13.         // 当两个Future都完成时,组合它们的结果
  14.         CompletableFuture<String> combinedFuture = future1.thenCombine(future2, (s1, s2) -> s1 + " " + s2);
  15.         try {
  16.             // 获取最终结果
  17.             String result = combinedFuture.get();
  18.             System.out.println(result);
  19.         } catch (InterruptedException | ExecutionException e) {
  20.             e.printStackTrace();
  21.         }
  22.     }
  23.     private static void simulateDelay(int millis) {
  24.         try {
  25.             Thread.sleep(millis);
  26.         } catch (InterruptedException e) {
  27.             Thread.currentThread().interrupt();
  28.         }
  29.     }
  30. }
复制代码
12. 利用Spring Boot实现RESTful API

Spring Boot极大简化了创建基于Spring的应用程序的过程,特殊是用于开发RESTful服务。下面是一个基本的Spring Boot应用,它暴露了一个CRUD操作的REST API来管理用户资源:
首先,确保你的项目包含Spring Boot Starter Web依赖:
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
复制代码
然后,创建一个简朴的User实体类和对应的Repository、Service、Controller层:
  1. // User.java
  2. public class User {
  3.     private Long id;
  4.     private String name;
  5.     // Getter & Setter
  6. }
  7. // UserRepository.java
  8. public interface UserRepository extends JpaRepository<User, Long> {}
  9. // UserService.java
  10. @Service
  11. public class UserService {
  12.     @Autowired
  13.     private UserRepository userRepository;
  14.     // CRUD操作方法
  15. }
  16. // UserController.java
  17. @RestController
  18. @RequestMapping("/api/users")
  19. public class UserController {
  20.     @Autowired
  21.     private UserService userService;
  22.     @GetMapping
  23.     public List<User> getUsers() {
  24.         return userService.getAllUsers();
  25.     }
  26.     @PostMapping
  27.     public ResponseEntity<User> createUser(@RequestBody User user) {
  28.         User savedUser = userService.createUser(user);
  29.         return ResponseEntity.ok(savedUser);
  30.     }
  31.     // 更多CRUD操作的映射...
  32. }
复制代码
这些示例涵盖了从并发编程、异步处理到构建RESTful服务的多个方面,展示了Java在现实开发中的灵活性和强盛功能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万万哇

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表