本文介绍了一些关于Java API安全和性能方面的简单易用的技巧,其中包括保证API Key安全和开发Web Service方面中在框架方面选择的一些建议。程序员
程序员都喜欢使用API!例如为app应用构建API或做为微服务架构体系的一部分。固然,使用API的前提是能让你的工做变得更轻松。为了简化开发和提升工做效率所做出的努力,有时也意味着须要寻找新的类库或者过程(或者减小过程)。对于不少开发团队来讲,对于其APP和API进行管理认证和访问控制要耗费不少的时间,所以咱们需想分享一些技巧,它们能节约你的时间,减小代码编写量,并能让你的应用更加安全和易于维护。
先介绍下本文说起的背景知识:Okta是一个基于REST、JSON API构建的Java应用,使用Spring框架构建。咱们公司的应用,是保存用户的身份凭证和其余公司的敏感数据,因此对咱们来讲,安全是最重要的。所以,我对这些技巧的第一个要求是,它们能帮助令到你的Java应用更安全。算法
这些建议应该是任何类型的Java应用都是通用的。它们会帮助你更快地编写代码,但代码量更少了,同时又更安全:这真的是三赢的结果! spring
#1. 不要本身去实现安全框架
说真的,不要尝试本身去实现安全方面的代码,这太难了。 浏览器
几乎每一个人都知道避免去实现加密等算法。一样道理,你的应用的安全栈的其他部分也是同样,可能须要花费很大,获得的风险也很大。你极可能会犯一些错误。自1999年以来,已经有89373个CVE(公共漏洞和暴露)发布了。而其中公开的大部分的发现者都是那些很是聪明的人。安全
你可能认为处理一个简单的用例(例如验证用户的密码)是很简单的事情——你所作的一切只是比较一对字符串。这样想就错了。你须要验证密码的哈希值,审核尝试登陆的次数,减小针对字典的攻击,这只是冰山一角。你最好的选择是使用现有的成熟的库或框架,例如Apache的Shiro或者SpringSecurity,让这些框架去处理各种复杂的安全问题。bash
#2. Use TLS, Always! 永远使用TLS!
如今已是2017年了,全部的网站都应该使用HTTPS了,甚至是公司的内网。Let’s encrypt让HTTPS变得轻松和简单,这意味着你能再也不使用不安全的自签密钥了!你甚至能够在本地设置带证书认证的Tomcat或者Nginx实例。服务器
能让你的应用须要TLS(HTTPS/SSL)只须要简单的一行代码,全部人都应该这样作!若是使用Apache Shiro框架,只须要设置属性:session
[urls]/** = ssl复制代码
若是使用Spring Security,,只须要在设置HttpSecurity时,简单调用一个方法便可。架构
http.requiresChannel()
.anyRequest().requiresSecure();复制代码
在Spring Boot中,仅需设置一些属性,以下:app
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>`
Java学习交流QQ群:589809992 咱们一块儿学Java!复制代码
而后就能够经过浏览器中,在访问应用地址后输入/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 把它们放在“危险区域”,以提醒用户,这是十分有用的。