使用Java API的5个技巧

本文介绍了一些关于Java API安全和性能方面的简单易用的技巧,其中包括保证API Key安全和开发Web Service方面中在框架方面选择的一些建议。

程序员都喜欢使用API!例如为app应用构建API或作为微服务架构体系的一部分。当然,使用API的前提是能让你的工作变得更轻松。为了简化开发和提高工作效率所作出的努力,有时也意味着需要寻找新的类库或者过程(或者减少过程)。对于很多开发团队来说,对于其APP和API进行管理认证和访问控制要耗费很多的时间,因此我们需想分享一些技巧,它们能节约你的时间,减少代码编写量,并能让你的应用更加安全和易于维护。 先介绍下本文提及的背景知识:Okta是一个基于REST、JSON API构建的Java应用,使用Spring框架构建。我们公司的应用,是保存用户的身份凭证和其他公司的敏感数据,所以对我们来说,安全是最重要的。因此,我对这些技巧的第一个要求是,它们能帮助令到你的Java应用更安全。

这些建议应该是任何类型的Java应用都是通用的。它们会帮助你更快地编写代码,但代码量更少了,同时又更安全:这真的是三赢的结果!

1. 不要自己去实现安全框架

说真的,不要尝试自己去实现安全方面的代码,这太难了。

几乎每个人都知道避免去实现加密等算法。同样道理,你的应用的安全栈的其余部分也是一样,可能需要花费很大,得到的风险也很大。你很可能会犯一些错误。自1999年以来,已经有89373个CVE(公共漏洞和暴露)发布了。而其中公开的大部分的发现者都是那些非常聪明的人。

你可能认为处理一个简单的用例(例如验证用户的密码)是很简单的事情——你所做的一切只是比较一对字符串。这样想就错了。你需要验证密码的哈希值,审核尝试登录的次数,减少针对字典的攻击,这只是冰山一角。你最好的选择是使用现有的成熟的库或框架,例如Apache的Shiro或者SpringSecurity,让这些框架去处理各类复杂的安全问题。

2. Use TLS, Always! 永远使用TLS!

现在已经是2017年了,所有的网站都应该使用HTTPS了,甚至是公司的内网。Let’s encrypt让HTTPS变得轻松和简单,这意味着你能不再使用不安全的自签密钥了!你甚至可以在本地设置带证书认证的Tomcat或者Nginx实例。

能让你的应用需要TLS(HTTPS/SSL)只需要简单的一行代码,所有人都应该这样做!如果使用Apache Shiro框架,只需要设置属性:

[urls]/** = ssl

如果使用Spring Security,,只需要在设置HttpSecurity时,简单调用一个方法即可。

http.requiresChannel()
.anyRequest().requiresSecure();

在Spring Boot中,仅需设置一些属性,如下:

server.port=8443
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=secret
server.ssl.key-password=another-secret

3. 使用Spring Boot创建Web Service

Spring Boot是Spring平台的一个简化,能让编写Spring应用变得很简单,例如能用很少的代码,编写《app应用中考虑的12个因素》一文中提到的观点。如果你还在使用建War包的方式编码,那么Spring Boot值得你去学习。使用Spring Boot可以复杂的、不同类型的应用,例如可以使用简单的注解(@EnableResourceServer)就搭建一个OAuth资源服务器,或者通过简单的属性改变其端口:

server.port = 8090

如果不喜欢使用SpringBoot,那么可以使用Dropwizard去搭建JAX-RS技术栈。

4. 监视应用和性能指标

如果无任何数据的情况下是很难发现程序的错误的。Spring Boot通过使用Actuator,能让收集指标数据变得容易,只需要在应用中增加一个依赖,如下:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>`

然后就可以通过浏览器中,在访问应用地址后输入/health 或者/metrics去检查应用的健康情况或者指标。Dropwizard框架通过/healthcheck和/metrics实现同样的功能。

下面是Spring Boot应用通过/metrics 输出的结果:

    {
    "classes": 7704,
    "classes.loaded": 7704,
    "classes.unloaded": 0,
    "counter.status.200.metrics": 1,
    "gauge.response.metrics": 99.0,
    "gc.ps_marksweep.count": 2,
    "gc.ps_marksweep.time": 272,
    "gc.ps_scavenge.count": 8,
    "gc.ps_scavenge.time": 136,
    "heap": 3728384,
    "heap.committed": 470016,
    "heap.init": 262144,
    "heap.used": 207793,
    "httpsessions.active": 0,
    "httpsessions.max": -1,
    "instance.uptime": 25020,
    "mem": 529086,
    "mem.free": 262222,
    "nonheap": 0,
    "nonheap.committed": 60608,
    "nonheap.init": 2496,
    "nonheap.used": 59067,
    "processors": 8,
    "systemload.average": 5.56103515625,
    "threads": 24,
    "threads.daemon": 22,
    "threads.peak": 28,
    "threads.totalStarted": 32,
    "uptime": 37182}

5. 保护敏感信息

人们都认为API密钥是不安全的,这是事实。密钥通过电子邮件发送或源代码管理系统控制。也许这是它们看起来比密码更不安全的原因,但它们也一样敏感。如果需要将API密钥存储在文件中,请确保授予文件有限的访问权限。例如,我们建议在私人目录

中存放Okta的YAML文件并且赋予文件所有者只读权限。

$ chmod u=r,go-rwx ~/.okta/okta.yaml

如果你正为使用你的APP的用户创建API,记得提醒他们,如果无设置好权限的话,.SSH的忽文件是放在你的~/.ssh目录下,如果无设置好权限的话。GitHub 把它们放在“危险区域”,以提醒用户,这是十分有用的。

原文发布于微信公众号 - Java团长(javatuanzhang)

原文发表时间:2017-10-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏史上最简单的Spring Cloud教程

我是如何根据豆瓣api来理解Restful API设计的

1.什么是REST REST全称是Representational State Transfer,表述状态转移的意思。它是在Roy Fielding博士论文首次...

29450

IAAS与PAAS的开发者视角

在我以前的文章中,解释了云计算的基本概念,包括它的定义,特性和各种服务模式。在本文中,将从开发者的角度对基础设施即服务(IAAS:Infrastrqucture...

37470
来自专栏Java学习123

ESB企业服务总线

615140
来自专栏java架构学习交流

java web方面的面试问题,Spring MVC方面的面试问题,摘自java web轻量级开发面试教程

下面列出Spring Web方面的常见问题,除此之外,大家也可以自己不断收集,不断提升。 问题1,你们的项目是如何搭建Spring Web框架的,具体而言,如何...

23280
来自专栏Java职业技术分享

阿里P8架构师谈:什么是缓存雪崩?服务器雪崩的场景与解决方案

分布式系统都存在这样一个问题,由于网络的不稳定性,决定了任何一个服务的可用性都不是 100% 的。当网络不稳定的时候,作为服务的提供者,自身可能会被拖死,导致服...

43000
来自专栏芋道源码1024

深入理解负载均衡

负载均衡是高可用架构的一个关键组件,主要用来提高性能和可用性,通过负载均衡将流量分发到多个服务器,同时多服务器能够消除这部分的单点故障。

20810
来自专栏恰童鞋骚年

.NET Core微服务之基于Jenkins+Docker实现持续部署(Part 1)

  互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuous integration,简称 CI) => 持续集成指的...

10340
来自专栏芋道源码1024

IntelliJ IDEA 内存优化最佳实践

【编者按】本文作者在和同事的一次讨论中发现,对 IntelliJ IDEA 内存采用不同的设置方案,会对 IDE 的速度和响应能力产生不同的影响。

52570
来自专栏用户2442861的专栏

基于xmpp openfire smack开发之openfire介绍和部署[1]

http://blog.csdn.net/shimiso/article/details/8816558

17420
来自专栏格子的个人博客

JMeter安装配置和分布式

前段时间公司的新项目上线了一段时间之后,随着运营规模的变大,老大要求对系统进行一个摸底,那么肯定有人要为这个伟大的工作献身了,是的,那个人就是我。谁让我是就是打...

11820

扫码关注云+社区

领取腾讯云代金券