Java对字符串加密并返回星号※
If you don't look back, you'll never know I waiting for you behind you.
Java对字符串加密并返回星号※
PasswordUtils这个加密工具类是在Ranger项目的源码中发现的,它是一个安全管理框架,普通的加密需求应该用它的加密工具类就OK了;
首先,用户输入密码,前端先用type为password把密码显示为※,但是这时通过F12查看,浏览器仍然可以看到密码信息,但是这是用户自己输入的,第一把看见也ok;一旦请求提交立刻返回经加密后的密码,此处并非返回加密后的密码,而是直接返回一个※密码如“******”,并把转换加密后的密码存入数据库,之后每次请求也都返回“******”;然后在后台需要用到密码的地方就自己解密咯。
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.9</version>
</dependency>
加密工具类PasswordUtils:
package org.apache.ranger.plugin.util; import java.io.IOException;
import java.util.Map; import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec; import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.sun.jersey.core.util.Base64;
public class PasswordUtils { private static final Logger LOG = LoggerFactory.getLogger(PasswordUtils.class); private final String CRYPT_ALGO;
private String password;
private final char[] ENCRYPT_KEY;
private final byte[] SALT;
private final int ITERATION_COUNT;
private final char[] encryptKey;
private final byte[] salt;
private static final String LEN_SEPARATOR_STR = ":"; public static final String DEFAULT_CRYPT_ALGO = "PBEWithMD5AndDES";
public static final String DEFAULT_ENCRYPT_KEY = "tzL1AKl5uc4NKYaoQ4P3WLGIBFPXWPWdu1fRm9004jtQiV";
public static final String DEFAULT_SALT = "f77aLYLo";
public static final int DEFAULT_ITERATION_COUNT = 17; public static String encryptPassword(String aPassword) throws IOException {
return new PasswordUtils(aPassword).encrypt();
} private String encrypt() throws IOException {
String ret = null;
String strToEncrypt = null;
if (password == null) {
strToEncrypt = "";
} else {
strToEncrypt = password.length() + LEN_SEPARATOR_STR + password;
}
try {
Cipher engine = Cipher.getInstance(CRYPT_ALGO);
PBEKeySpec keySpec = new PBEKeySpec(encryptKey);
SecretKeyFactory skf = SecretKeyFactory.getInstance(CRYPT_ALGO);
SecretKey key = skf.generateSecret(keySpec);
engine.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(salt, ITERATION_COUNT));
byte[] encryptedStr = engine.doFinal(strToEncrypt.getBytes());
ret = new String(Base64.encode(encryptedStr));
}
catch(Throwable t) {
LOG.error("Unable to encrypt password due to error", t);
throw new IOException("Unable to encrypt password due to error", t);
}
return ret;
} PasswordUtils(String aPassword) {
String[] crypt_algo_array = null;
int count = 0;
if (aPassword != null && aPassword.contains(",")) {
count = StringUtils.countMatches(aPassword, ",");
crypt_algo_array = aPassword.split(",");
}
if (crypt_algo_array != null && crypt_algo_array.length > 4) {
CRYPT_ALGO = crypt_algo_array[0];
ENCRYPT_KEY = crypt_algo_array[1].toCharArray();
SALT = crypt_algo_array[2].getBytes();
ITERATION_COUNT = Integer.parseInt(crypt_algo_array[3]);
password = crypt_algo_array[4];
if (count > 4) {
for (int i = 5 ; i<=count ; i++){
password = password + "," + crypt_algo_array[i];
}
}
} else {
CRYPT_ALGO = DEFAULT_CRYPT_ALGO;
ENCRYPT_KEY = DEFAULT_ENCRYPT_KEY.toCharArray();
SALT = DEFAULT_SALT.getBytes();
ITERATION_COUNT = DEFAULT_ITERATION_COUNT;
password = aPassword;
}
Map<String, String> env = System.getenv();
String encryptKeyStr = env.get("ENCRYPT_KEY");
if (encryptKeyStr == null) {
encryptKey=ENCRYPT_KEY;
}else{
encryptKey=encryptKeyStr.toCharArray();
}
String saltStr = env.get("ENCRYPT_SALT");
if (saltStr == null) {
salt = SALT;
}else{
salt=saltStr.getBytes();
}
} public static String decryptPassword(String aPassword) throws IOException {
return new PasswordUtils(aPassword).decrypt();
} private String decrypt() throws IOException {
String ret = null;
try {
byte[] decodedPassword = Base64.decode(password);
Cipher engine = Cipher.getInstance(CRYPT_ALGO);
PBEKeySpec keySpec = new PBEKeySpec(encryptKey);
SecretKeyFactory skf = SecretKeyFactory.getInstance(CRYPT_ALGO);
SecretKey key = skf.generateSecret(keySpec);
engine.init(Cipher.DECRYPT_MODE, key,new PBEParameterSpec(salt, ITERATION_COUNT));
String decrypted = new String(engine.doFinal(decodedPassword));
int foundAt = decrypted.indexOf(LEN_SEPARATOR_STR);
if (foundAt > -1) {
if (decrypted.length() > foundAt) {
ret = decrypted.substring(foundAt+1);
}
else {
ret = "";
}
}
else {
ret = null;
}
}
catch(Throwable t) {
LOG.error("Unable to decrypt password due to error", t);
throw new IOException("Unable to decrypt password due to error", t);
}
return ret;
} public static String getDecryptPassword(String password) {
String decryptedPwd = null;
try {
decryptedPwd = decryptPassword(password);
} catch (Exception ex) {
LOG.warn("Password decryption failed, trying original password string.");
decryptedPwd = null;
} finally {
if (decryptedPwd == null) {
decryptedPwd = password;
}
}
return decryptedPwd;
}
}
测试加密/解密执行结果:
package com.xinyan.springcloud.tjt; public class TestDecryptEncrypt { public static void main(String[] args) throws Exception {
String password = "taojietaoge";
//加密:
String encryptPassword = PasswordUtils.encryptPassword(password);
System.out.println("加密后:"+ encryptPassword);
//解密:
String decryptPassword = PasswordUtils.decryptPassword(encryptPassword);
System.out.println("解密后:"+ decryptPassword);
} }
执行结果如下:
Java对字符串加密并返回星号※的更多相关文章
- Java-Runoob-高级教程-实例-字符串:06. Java 实例 - 字符串查找
ylbtech-Java-Runoob-高级教程-实例-字符串:06. Java 实例 - 字符串查找 1.返回顶部 1. Java 实例 - 字符串搜索 Java 实例 以下实例使用了 Strin ...
- Java-Runoob-高级教程-实例-字符串:05. Java 实例 - 字符串反转
ylbtech-Java-Runoob-高级教程-实例-字符串:05. Java 实例 - 字符串反转 1.返回顶部 1. Java 实例 - 字符串反转 Java 实例 以下实例演示了如何使用 J ...
- Java-Runoob-高级教程-实例-字符串:04. Java 实例 - 字符串替换
ylbtech-Java-Runoob-高级教程-实例-字符串:04. Java 实例 - 字符串替换 1.返回顶部 1. Java 实例 - 字符串替换 Java 实例 如何使用java替换字符串 ...
- Java-Runoob-高级教程-实例-字符串:01. Java 实例 – 字符串比较
ylbtech-Java-Runoob-高级教程-实例-字符串:01. Java 实例 – 字符串比较 1.返回顶部 1. Java 实例 - 字符串比较 Java 实例 以下实例中我们通过字符串函 ...
- Java-Runoob-高级教程-实例-字符串:13. Java 实例 - 字符串格式化
ylbtech-Java-Runoob-高级教程-实例-字符串:13. Java 实例 - 字符串格式化 1.返回顶部 1. Java 实例 - 字符串格式化 Java 实例 以下实例演示了通过 f ...
- Java-Runoob-高级教程-实例-字符串:12. Java 实例 - 字符串优化
ylbtech-Java-Runoob-高级教程-实例-字符串:12. Java 实例 - 字符串优化 1.返回顶部 1. Java 实例 - 字符串优化 Java 实例 以下实例演示了通过 Str ...
- Java-Runoob-高级教程-实例-字符串:07. Java 实例 - 字符串分割
ylbtech-Java-Runoob-高级教程-实例-字符串:07. Java 实例 - 字符串分割 1.返回顶部 1. Java 实例 - 字符串分割 Java 实例 以下实例使用了 split ...
- Java实现MD5加密_字符串加密_文件加密
Java实现MD5加密,具体代码如下: package com.bstek.tools; import java.io.FileInputStream; import java.io.IOExcept ...
- Java生成MD5加密字符串代码实例
这篇文章主要介绍了Java生成MD5加密字符串代码实例,本文对MD5的作用作了一些介绍,然后给出了Java下生成MD5加密字符串的代码示例,需要的朋友可以参考下 (1)一般使用的数据库中都会保存用 ...
随机推荐
- JQuery制作基础的无缝轮播与左右点击效果
在网页中我们想要的无缝轮播左右循环有好多好多中,这是我第一个轮播效果,也是最基础的,和大家分享一下,对于初学者希望你们能有所借鉴,对于大神我想让你们尽情的虐我给我宝贵的意见. 这个是我要的效果 进入正 ...
- zfs文件系统简单使用
关于ubuntu下zfs的使用参考:https://github.com/zfsonlinux/zfs/wiki/Ubuntu%2016.04%20Root%20on%20ZFS 安装zfs: 启动z ...
- redis的持久化之AOF
AOF Redis 分别提供了 RDB 和 AOF 两种持久化机制: RDB 将数据库的快照(snapshot)以二进制的方式保存到磁盘中. AOF 则以协议文本的方式,将所有对数据库进行过写入的命令 ...
- java开发中的Mutex vs Semaphore
先看一下stackoverflow上是怎么说的吧 原文地址:http://stackoverflow.com/questions/771347/what-is-mutex-and-semaphore- ...
- “史上更难就业季”暴露出啥隐情?
如果说,2013年中国高校毕业生达到699万,被称为"史上最难就业季".那么2014年将成为去年之后的"更难就业季".据最新资料显示,2014年应届大学毕业 ...
- Java NIO Scatter / Gather
原文链接:http://tutorials.jenkov.com/java-nio/scatter-gather.html Java NIO发布时内置了对scatter / gather的支持.sca ...
- CentOS6.*安装gitolite
http://www.kankanews.com/ICkengine/archives/64748.shtml 2人收藏此文章, 发表于4小时前(2013-10-22 16:12) , 已有26次阅读 ...
- 利用javaScript实现鼠标在文字上悬浮时弹出悬浮层
在人人,CSDN等一些网站,当鼠标在某个东西上悬浮时,会弹出一个悬浮层,鼠标移开悬浮层消失.比如说CSDN的通知(应该是进入写新文章的页面后页面上方的那个铃铛),具体是什么实现的呢?上代码: < ...
- Redis Rpop 命令
Redis Rpop 命令用于移除并返回列表的最后一个元素. 语法 redis Rpop 命令基本语法如下: redis 127.0.0.1:6379> RPOP KEY_NAME 可用版本 & ...
- dictionary.go
package sego import "github.com/adamzy/cedar-go" // Dictionary结构体实现了一个字串前缀树,一个分词可能出现在叶子节点也 ...