https://blog.csdn.net/Golden_soft/article/details/80952243这篇博客写了idea的导入方法,多谢博主。
前端后端都是应该要加密的,前端可以发送一个hidden域的加密后的password到后台,后台再对这段数据进行再次加密的处理,两端的加密算法不一样,由双方自己掌握,但是明文密码按规矩是不可以直接传输的。
不要传输明文密码。 实际上你传过来到后台的数据。在我后台看来就是密码,我后台会对这段字符再次进行加密,数据库中会储存我加密后的密码值。校验的时候,从数据库取出加密后的密码,并获取前端传输过来的字符串,用相应的算法对两者进行比对就可以了。
你有没有发现MD5 加密之后的长度是一样的,不管原本的信息有多长?这是因为 MD5 是摘要算法,有点类似于从你要加密的信息中选取一部分信息出来加密,所以即使你得到了 MD5 加密之后的结果,也很难从一部分信息中反推出原本的完整信息。另外,MD5 也是存在被破解的情况,那就是最传统的破解方法,从一堆数据中一个个去试。所以, MD5 可以设置一个盐值,类似于干扰信息,可以降低被破解的概率。
你应该是对一个对象用了toString方法,所以才会这样,你再看看你需要输出的到底是什么?用GET方法后再toString或许就可以了
《java加密与解密的艺术》
可能是转义的时候出的问题
因为我
public static void bcHmacMD5() {
HMac hmac = new HMac(new MD5Digest());
hmac.init(new KeyParameter(org.bouncycastle.util.encoders.Hex.decode("")));
hmac.update(src.getBytes(), 0, src.getBytes().length);
// 执行摘要
byte[] hmacMD5Bytes = new byte[hmac.getMacSize()];
hmac.doFinal(hmacMD5Bytes, 0);
System.out.println(" bc hmacMD5:" + org.bouncycastle.util.encoders.Hex.toHexString(hmacMD5Bytes));
}
得到的结果: bc hmacMD5:b87f98c51d1df76cfb5348c5619ad14f
与一样
另外在测试这个页面的时候发现"aaaaaaaaaaaa"也可以作为密钥
可能是为了防止报错,那个页面的算法为了解析密钥的时候还将密钥中的元素全部进行转义了一遍
alt+/
老师只是提供了你一种学习的思路,但是实际运用过程中,很多知识还是要自己去总结的
没有导入commons-codec jar包
百度下:commons-codec-1.10.jar 下载下来导入就行了。
MD、SHA、MAC等等其他的加密
一个byte是八比特,new String时按照byte的值到字符表中找对应的字符来生成字符串。Hex.byteArrayToString是把一个byte变成两个十六进制的英文与数字组合,内容当然就不会一样。
成功通过
无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。例如应用MD5算法摘要的消息有128个比特位,用SHA-1算法摘要的消息最终有160比特位的输出,SHA-1的变体可以产生192比特位和256比特位的消息摘要。一般认为,摘要的最终输出越长,该摘要算法就越安全。
不一定是10个,key的元素个数是偶数就行。
以下是CC的Hex.decodeHex()方法的文档注释:
BC报这个异常的原因应该类似。
这个是因为DigestUtils.sha1Hex(src)中是默认使用UTF-8的编码格式来获取字节数组的,而DigestUtils.sha1Hex(src.getBytes())是用系统默认的编码格式来获取字节数组的,不一定是UTF-8。
由于字节数组不同,所以结果也不同
所以
DigestUtils.sha1Hex(src)
应该等于
DigestUtils.sha1Hex(src.getBytes("UTF-8"))
没什么意义吧。。。
控制台上的32是128(二进制)转化成16进制的结果。
4个2进制位恰好是一个16进制位,那么128(二进制)/4=32(十六进制)。
MD5 Message-Digest算法计算一个字符串 str 的MD5哈希值并返回. 这个哈希值是一个32个字符的16进制数.
应该是jdk1.8吧
相对来还是叫安全的,如果你说的是截获摘要,那么请问,截获一次摘要,截获者是几乎不可能破译摘要的内容,那么密码就无法修改,你下次登录就会出现异地登录的提示,这样你就该修改密码了,网上有人提供MD5的解密网站,说是解密,其实就是大量数据信息对比,你输个123456的MD值获取能破解,再复杂一点点就破解不了了
MD5是摘要算法,类似有损压缩一样,不能复原的,因此不能解密。
网上的使用一般是在用户点击提交的时候用js,或Java 加密后的密码存到数据库中,这时候别人如果打开数据库看也不知道你原来的密码是什么。但是你登录的时候输入密码后再重新用MD5摘要加密,看看出来的结果与数据库中是否一致,如果一致登录成功,不一致证明你输入错误了。
所以用MD5存密码,除了你谁都不知道密码是什么,但是如果你忘了也就不能去数据库看了,只能改密码,而不能找回。
来自百度 ,谢谢采纳
还原密钥的说法是不是不准确啊?我觉得是这样的:
在使用Secretkey是,可以用系统生成的密钥:
KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");//指定生成密钥所使用的算法
SecretKey key = keyGen.generateKey();//生成一个密钥,这里生成的密钥是符合算法的标准规范的密钥。如果不想麻烦也可以把字符串当作的密钥,就像老师代码中的十个a。有了这个key就可以保证以下代码生成的密钥是准确无误的了。
SecretKey mainKey = new SecretKeySpec(key.getEncoded(),"HmacMD5");//之前的key是生成mainKey的准备条件,而只有标准规范的key而不是指定的字符串可以更好生成符合标准要求的mainKey。
有了这个mainKey,那么这就可以完成其它步骤了。
MD算法是不可还原的,就是说加密之后是不可以通过密文再逆向计算生成明文的。
后台处理