加密与加盐
来源:互联网 发布:微信群聊机器人软件 编辑:程序博客网 时间:2024/06/14 16:47
加密
我们在用户模块,对于用户密码的保护,通常都会进行加密。从最简单来说,小明盗取了你的数据库信息(小明躺枪),但由于你对你数据库中的用户信息的密码是加密的(我们假设加密之后的密文是无法破解的),那小明即使得到信息也没法进行登录。这是最最基本的一点防范措施。
我们通常的做法是,用户在提交注册信息时,在后台的业务逻辑中将密码进行加密(例如采用MD5或者BCrypt加密算法),所以存放在数据库中的信息为加密之后的密文。例如,如果小红在你的系统中注册了自己的账号,她提交的注册信息中的密码为”admin”,那么实际存到数据库中的密码为“21232F297A57A5A743894A0E4A801FC3”(假设采用MD5加密,并且不会被破解)。这样我们至少保证了只有小红本人能够通过其账号进行登录,因为密码只有她自己知道。
当小红用其账号进行登录的过程中,她将自己的用户名和密码提交给后台的服务器,服务器得到密码之后,采用同样的加密方法(MD5加密),也会得到密文,这个时候再与数据库中的密码字段的数据进行字符串的比较,相同就代表验证通过。
PS:顺便提一句,MD5和BCrypt加密算法都比较流行,相对来说,BCrypt算法比MD5更安全,但是加密更慢。
加盐
上文就是对于加密的一个简单陈述。那什么是加盐呢?当我第一次看到这个词的时候,我想到了我妈做的饭,因为我妈做饭一直都很淡= =
回到咱们要讲的加盐(Salt)。其实加盐是为了应对这么一种情况:如果两个人或多个人的密码相同,那么通过相同的加密算法得到的是相同的结果。这样会造成哪些后果呢?首先,破解一个就有可能是相当于破一片密码。而且加入小明这个用户可以查看后台数据库,那么如果他观察到小红这个用户的密码跟自己的密码是一样的(虽然都是密文),那么,也就代表他们两个人的密码是相同的。所以他就可以用小红的身份进行登录了。
其实,我们只要稍微混淆一下就能防范住了,这在加密术语中称为“加盐”。具体来说就是在原有材料(用户自定义密码)中加入其他成分(一般是用户自有且不变的因素),以此来增加系统复杂度。当这种盐和用户密码结合后,再通过摘要处理,就能得到隐蔽性更强的摘要值。
关于BCrypt加密的Demo
在本文中,将不去介绍如何实现MD5加密以及加盐,因为MD5太普遍。我记得在大一开始学Java的时候,每当遇到用户管理,对用户信息的加密都是通过MD5来进行的,但鉴于我自身的情况,我也是后期才晓得BCrypt这个加密算法,所以我也自己做了Demo来进行学习一下。
1、可以在官网中取得源代码http://www.mindrot.org/projects/jBCrypt/
2、通过Ant进行编译。编译之后得到jbcrypt.jar。也可以不需要进行编译,而直接使用源码中的java文件(本身仅一个文件)。
3、下面是官网的一个Demo
public class BCryptDemo { public static void main(String[] args) { // Hash a password for the first time String password = "testpassword"; String hashed = BCrypt.hashpw(password, BCrypt.gensalt()); System.out.println(hashed); // gensalt's log_rounds parameter determines the complexity // the work factor is 2**log_rounds, and the default is 10 String hashed2 = BCrypt.hashpw(password, BCrypt.gensalt(12)); // Check that an unencrypted password matches one that has // previously been hashed String candidate = "testpassword"; //String candidate = "wrongtestpassword"; if (BCrypt.checkpw(candidate, hashed)) System.out.println("It matches"); else System.out.println("It does not match"); } }
在这个例子中,BCrypt.hashpw(password, BCrypt.gensalt())是核心。通过调用BCrypt类的静态方法hashpw对password进行加密。第二个参数就是我们平时所说的加盐。BCrypt.checkpw(candidate, hashed)该方法就是对用户后来输入的密码进行比较。如果能够匹配,返回true。
技术交流学习或者有任何问题欢迎加群
编程技术交流群 : 154514123
Java技术交流群 : 6128790
- 加密与加盐
- 加密与加盐
- 加盐加密
- 加盐加密
- 文件加密与加盐及引深应用
- MD5加密和加盐
- Java加盐加密
- MD5加密技术(加盐)
- php加盐加密
- MD5 (加盐) 加密
- MD5加密+加盐
- 密码Md5加密+加盐
- 加盐加密的方式
- MD5 加密 以及 加盐加密
- Android中MD5加密加盐
- 密码加密之salt(加盐)
- Java/Android中的MD5加密加盐方法
- 使用加盐的散列加密
- 关于Linux连接不了外网的问题解决方案
- 面向对象与面向过程的区别
- IO流_FileOutputStream写出数据实现换行和追加写入
- Linux中fstat、stat和lstat的用法与区别
- WebView透明
- 加密与加盐
- Kotlin学习之跳转
- 详解新硬盘如何分区的操作方法
- 二分图
- 在网页上使用 JPG 、PNG 、 SVG
- 大数据平台架构——通用版
- MyEclipse 2015 stable1运行后出错:SECURITY ALERT: INTEGERITY CHECK ERROR
- StringUtils API(中英文对照)
- Ajax实现动态拼接a标签,连接跳转,样式丢失问题(dwz框架)