Java通过BCrypt加密

<div id="cnblogs\_post\_body" class="blogpost-body"><div>一、概述</div> <p>&nbsp;</p> <p>在用户模块,对于用户密码的保护,通常都会进行加密。我们通常对密码进行加密,然后存放在数据库中,在用户进行登录的时候,将其输入的密码进行加密然后与数据库中存放的密文进行比较,以验证用户密码是否正确。</p> <div>目前,MD5和BCrypt比较流行。相对来说,BCrypt比MD5更安全,但加密更慢。</div> <div>&nbsp;</div> <div> <div>二、使用BCrypt</div> <div>&nbsp;</div> <div>首先,可以在官网中取得源代码<a href="http://www.mindrot.org/projects/jBCrypt/" target="\_blank">http://www.mindrot.org/projects/jBCrypt/</a></div> <div>然后通过Ant进行编译。编译之后得到jbcrypt.jar。也可以不需要进行编译,而直接使用源码中的java文件(本身仅一个文件)。</div> <div>下面是官网的一个Demo。</div> <div> <div> <div class="cnblogs\_code"><div class="cnblogs\_code\_toolbar"><span class="cnblogs\_code\_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="https://my.oschina.net//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> BCryptDemo { </span><span style="color: #0000ff;"> public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String\[\] args) { </span><span style="color: #008000;">   //</span><span style="color: #008000;"> Hash a password for the first time</span>     String password = "testpassword"<span style="color: #000000;">;     String hashed </span>=<span style="color: #000000;"> BCrypt.hashpw(password, BCrypt.gensalt());     System.out.println(hashed);   </span><span style="color: #008000;">//</span><span style="color: #008000;"> gensalt's log\_rounds parameter determines the complexity   </span><span style="color: #008000;">//</span><span style="color: #008000;"> the work factor is 2\*\*log\_rounds, and the default is 10</span>   String hashed2 = BCrypt.hashpw(password, BCrypt.gensalt(12<span style="color: #000000;">));

  </span><span style="color: #008000;">//</span><span style="color: #008000;"> Check that an unencrypted password matches one that has   </span><span style="color: #008000;">//</span><span style="color: #008000;"> previously been hashed</span>   String candidate = "testpassword"<span style="color: #000000;">;   </span><span style="color: #008000;">//</span><span style="color: #008000;">String candidate = "wrongtestpassword";</span>   <span style="color: #0000ff;">if</span><span style="color: #000000;"> (BCrypt.checkpw(candidate, hashed))     System.out.println(</span>"It matches"<span style="color: #000000;">);   </span><span style="color: #0000ff;">else</span><span style="color: #000000;">   System.out.println(</span>"It does not match"<span style="color: #000000;">);   } }</span></pre>

<div class="cnblogs\_code\_toolbar"><span class="cnblogs\_code\_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="https://my.oschina.net//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <p>&nbsp;</p> </div> <div>在这个例子中,</div> </div> <div> <div> <pre name="code" class="prettyprint linenums prettyprinted"></pre> <div class="linenums"> <div class="L0"><code class="language-java"><span class="typ">BCrypt<span class="pun">.<span class="pln">hashpw<span class="pun">(<span class="pln">password<span class="pun">,<span class="pln">&nbsp;<span class="typ">BCrypt<span class="pun">.<span class="pln">gensalt<span class="pun">())</span></span></span></span></span></span></span></span></span></span></span></code></div> </div> </div> <div>是核心。通过调用BCrypt类的静态方法hashpw对password进行加密。第二个参数就是我们平时所说的加盐。</div> </div> <div> <div> <pre name="code" class="prettyprint linenums prettyprinted"></pre> <div class="linenums"> <div class="L0"><code class="language-java"><span class="typ">BCrypt<span class="pun">.<span class="pln">checkpw<span class="pun">(<span class="pln">candidate<span class="pun">,<span class="pln">&nbsp;hashed)</span></span></span></span></span></span></span></code></div> </div> </div> <div>该方法就是对用户后来输入的密码进行比较。如果能够匹配,返回true。</div> </div> </div> <div>&nbsp;</div> <div> <div>三、加盐</div> </div> <div> <div>如果两个人或多个人的密码相同,加密后保存会得到相同的结果。破一个就可以破一片的密码。如果名为A的用户可以查看数据库,那么他可以观察到自己的密码和别人的密码加密后的结果都是一样,那么,别人用的和自己就是同一个密码,这样,就可以利用别人的身份登录了。</div> <div>其实只要稍微混淆一下就能防范住了,这在加密术语中称为“加盐”。具体来说就是在原有材料(用户自定义密码)中加入其它成分(一般是用户自有且不变的因素),以此来增加系统复杂度。当这种盐和用户密码相结合后,再通过摘要处理,就能得到隐蔽性更强的摘要值。</div> </div> 原文地址:https://www.cnblogs.com/xingzc/p/8624007.html</div>
点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

sshpass用法介绍

参考文章:http://www.mamicode.com/infodetail1105345.html1.ssh与sshpass的区别ssh登录需要与用户进行交互,需要用户输入密码sshpass允许使用p参数指定明文密码2.sshpass的用法使用\p参数指定密码sshpassppassw

Ubuntu 及Ubuntu server版如何启用root用户登录

默认安装Ubuntu都是不允许以root用户进行登录的,想要以root用户进行登录需要进行一些操作,主要是以下几个步骤:第一步以普通用户登录系统,创建root用户的密码,然后输入你要设置的密码,这样就完成了设置root用户密码的步骤第二步修改文件

Shiro要点概览与SpringBoot整合实例

1\.简介概念说明Subject主体,简化点说就是用户实体PrincipalSubject的唯一标识,如id、用户名、手机号、邮箱等Credential凭证信息,主体证明自己的东西,如密码、证书等Authenticator认证器,对Subject身份进行认证,例如验证用户的用户名和密码是否匹配Aut

Druid数据库连接池 实现数据库账号密码加密

jar包版本:druid1.0.15.jar1\.加密,用以下命令将用户名和密码加密cmd命令行执行javacpdruid1.0.15.jarcom.alibaba.druid.filter.config.ConfigTools加密串得到密文2.用户名解密:packag

Java通过BCrypt加密 - HelloWorld