
一、java 给密码字段加密
要是你想做得正规些,MD5或SHA1就是最好的选择了。它们至今都还十分安全。没发现有比这两者更好的解决方案。
MD5就是MD5,是一种算法,公开的,唯一的,没有安全的版本和普通的版本之分。大家用的MD5都是一样的。请始终记住,公开的才是安全的。密码学中都有讲的。
为了安全,你可以在MD5加密时,加些盐。举个例,将用户名,密码,和自定义的一些字符串连起来,然后再进行MD5计算。如:MyUsernameMyPasswordSalt。这么长的串是不容易破解的。你甚至可以连续使用两次MD5。
如果你光是对密码MD5加密,则网上有专门的破解工具,对于位数比较小的密码,极易破解,甚至秒杀。
二、java密码加密
package com.guoyj.jce;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
public class PwdDES {
public static final int kBufferSize = 8192;
// static String keyFile = "sdldosidfojs";
/**
* 生成密匙
* @param
* @return key
*/
public static SecretKey saveDesKey() {
// SecureRandom sr=new SecureRandom();
try {
// 获取密匙生成器,为我们选择的DES算法生成一个KeyGenerator对象
KeyGenerator kg = KeyGenerator.getInstance("DES");
// 初始化
// DES算法必须是56位
// DESede算法可以是112位或168位
// AES算法可以是128、192、256位
// kg.init(sr);
三、如何使用java对密码加密 加密方式aes
Java有相关的实现类:具体原理如下对于任意长度的明文,AES首先对其进行分组,每组的长度为128位。
分组之后将分别对每个128位的明文分组进行加密。对于每个128位长度的明文分组的加密过程如下:(1)将128位AES明文分组放入状态矩阵中。
(2)AddRoundKey变换:对状态矩阵进行AddRoundKey变换,与膨胀后的密钥进行异或操作(密钥膨胀将在实验原理七中详细讨论)。(3)10轮循环:AES对状态矩阵进行了10轮类似的子加密过程。
前9轮子加密过程中,每一轮子加密过程包括4种不同的变换,而最后一轮只有3种变换,前9轮的子加密步骤如下:● SubBytes变换:SubBytes变换是一个对状态矩阵非线性的变换;● ShiftRows变换:ShiftRows变换对状态矩阵的行进行循环移位;● MixColumns变换:MixColumns变换对状态矩阵的列进行变换;● AddRoundKey变换:AddRoundKey变换对状态矩阵和膨胀后的密钥进行异或操作。最后一轮的子加密步骤如下:● SubBytes变换:SubBytes变换是一个对状态矩阵非线性的变换;● ShiftRows变换:ShiftRows变换对状态矩阵的行进行循环移位;● AddRoundKey变换:AddRoundKey变换对状态矩阵和膨胀后的密钥进行异或操作;(4)经过10轮循环的状态矩阵中的内容就是加密后的密文。
AES的加密算法的伪代码如下。在AES算法中,AddRoundKey变换需要使用膨胀后的密钥,原始的128位密钥经过膨胀会产生44个字(每个字为32位)的膨胀后的密钥,这44个字的膨胀后的密钥供11次AddRoundKey变换使用,一次AddRoundKey使用4个字(128位)的膨胀后的密钥。
三.AES的分组过程对于任意长度的明文,AES首先对其进行分组,分组的方法与DES相同,即对长度不足的明文分组后面补充0即可,只是每一组的长度为128位。AES的密钥长度有128比特,192比特和256比特三种标准,其他长度的密钥并没有列入到AES联邦标准中,在下面的介绍中,我们将以128位密钥为例。
四.状态矩阵状态矩阵是一个4行、4列的字节矩阵,所谓字节矩阵就是指矩阵中的每个元素都是一个1字节长度的数据。我们将状态矩阵记为State,State中的元素记为Sij,表示状态矩阵中第i行第j列的元素。
128比特的明文分组按字节分成16块,第一块记为“块0”,第二块记为“块1”,依此类推,最后一块记为“块15”,然后将这16块明文数据放入到状态矩阵中,将这16块明文数据放入到状态矩阵中的方法如图2-2-1所示。块0块4块8块12块1块5块9块13块2块6块10块14块3块7块11块15图2-2-1 将明文块放入状态矩阵中五.AddRoundKey变换状态矩阵生成以后,首先要进行AddRoundKey变换,AddRoundKey变换将状态矩阵与膨胀后的密钥进行按位异或运算,如下所示。
其中,c表示列数,数组W为膨胀后的密钥,round为加密轮数,Nb为状态矩阵的列数。它的过程如图2-2-2所示。
图2-2-2 AES算法AddRoundKey变换六.10轮循环经过AddRoundKey的状态矩阵要继续进行10轮类似的子加密过程。前9轮子加密过程中,每一轮要经过4种不同的变换,即SubBytes变换、ShiftRows变换、MixColumns变换和AddRoundKey变换,而最后一轮只有3种变换,即SubBytes变换、ShiftRows变换和AddRoundKey变换。
AddRoundKey变换已经讨论过,下面分别讨论余下的三种变换。1.SubBytes变换SubBytes是一个独立作用于状态字节的非线性变换,它由以下两个步骤组成:(1)在GF(28)域,求乘法的逆运算,即对于α∈GF(28)求β∈GF(28),使αβ =βα = 1mod(x8 + x4 + x3 + x + 1)。
(2)在GF(28)域做变换,变换使用矩阵乘法,如下所示:由于所有的运算都在GF(28)域上进行,所以最后的结果都在GF(28)上。若g∈GF(28)是GF(28)的本原元素,则对于α∈GF(28),α≠0,则存在β ∈ GF(28),使得:β = gαmod(x8 + x4 + x3 + x + 1)由于g255 = 1mod(x8 + x4 + x3 + x + 1)所以g255-α = β-1mod(x8 + x4 + x3 + x + 1)根据SubBytes变换算法,可以得出SubBytes的置换表,如表2-2-1所示,这个表也叫做AES的S盒。
该表的使用方法如下:状态矩阵中每个元素都要经过该表替换,每个元素为8比特,前4比特决定了行号,后4比特决定了列号,例如求SubBytes(0C)查表的0行C列得FE。表2-2-1 AES的SubBytes置换表它的变换过程如图2-2-3所示。
图2-2-3 SubBytes变换AES加密过程需要用到一些数学基础,其中包括GF(2)域上的多项式、GF(28)域上的多项式的计算和矩阵乘法运算等,有兴趣的同学请参考相关的数学书籍。2.ShiftRows变换ShiftRows变换比较简单,状态矩阵的第1行不发生改变,第2行循环左移1字节,第3行循环左移2字节,第4行循环左移3字节。
ShiftRows变换的过程如图2-2-4所示。图2-2-4 AES的ShiftRows变换3.MixColumns变换在MixColumns变换中,状态矩阵的列看作是域GF(28)的多项式,模(x4+1)乘以c(x)的结果:c(x)=(03)x3+(01)x2+(01)x+(02)这里(03)为十六进制表示,依此类推。
c(x)与x4+1互质,故存在逆:d(x)=(0B)x3+(0D)x2+(0G)x+(0E)使c(x)。
四、java用md5密码加密有必要吗
数字证书
MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫 readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。
安全访问认证
MD5还广泛用于操作系统的登陆认证上,如Unix、各类BSD系统登录密码、数字签名等诸多方面。如在Unix系统中用户的密码是以MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行MD5 Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。MD5将任意长度的“字节串”映射为一个128bit的大整数,并且是通过该128bit反推原始字符串是困难的,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。所以,要遇到了md5密码的问题,比较好的办法是:你可以用这个系统中的md5()函数重新设一个密码,如admin,把生成的一串密码的Hash值覆盖原来的Hash值就行了。
正是因为这个原因,现在被黑客使用最多的一种破译密码的方法就是一种被称为"跑字典"的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。我们假设密码的最大长度为8位字节(8 Bytes),同时密码只能是字母和数字,共26+26+10=62个字符,排列组合出的字典的项数则是P(62,1)+P(62,2)….+P(62,8),那也已经是一个很天文的数字了,存储这个字典就需要TB级的磁盘阵列,而且这种方法还有一个前提,就是能获得目标账户的密码MD5值的情况下才可以。这种加密技术被广泛的应用于Unix系统中,这也是为什么Unix系统比一般操作系统更为坚固一个重要原因。
转载请注明出处51数据库 » javapassword加密
嗫?暁雲?