2023年7月31日发(作者:)

Web系统的密码加密问题(摘要算法)思路

盐值+MD5摘要算法1.为了防⽌字典破解(常⽤字符),先⽣成⼀个长度16位(位数最好和摘要算法的结果长度⼀致)的随机(安全随机数)byte数组作为盐值,通过Base64编码之后,将其和原密码按规则组合,保证进⾏摘要运算前的明⽂是⽆规律的。2.使⽤MD5摘要算法对明⽂进⾏运算得到⼀个长度16位的摘要byte数组,通过Base64编码后,得到⼀个24位的密⽂密码。

实现

⼯具类 1 public class PasswordProcessor { 2 public static void main(String[] args) { 3

4 } 5 public static byte[] makeSalt() { 6 SecureRandom secureRandom = null; 7 try { 8 secureRandom = tanceStrong(); // 尝试获取⾼强度安全随机数⽣成器 9 } catch (NoSuchAlgorithmException e) {10 secureRandom = new SecureRandom(); // 获取普通的安全随机数⽣成器11 }12 byte[] saltBuffer = new byte[16];13 tes(saltBuffer);14 return saltBuffer;15 }16

17 public static byte[] getDigest(String str) {18 MessageDigest md = null;19 try {20 md = tance("md5");21 } catch (NoSuchAlgorithmException e) {22 tackTrace();23 }24 byte[] digest = (es());25 return digest;26 }27 }

注册进⾏上述步骤,将盐值和密⽂密码分开存放。 1 public boolean signUpJudge(User user) { 2 r encoder = oder(); 3 byte[] salt = lt(); 4 String saltStr = ToString(salt); // 获取随机盐值 5 StringBuilder sb = new StringBuilder(); 6 (sword()).append(saltStr); 7 byte[] password = est(ng()); 8 sword(ToString(password)); // 获取密⽂密码 9 file("../images/profile/");10 int rs = User(user);11 int rs2 = Salt((), saltStr);12 if (rs == 1 && rs2 == 1) return true;13 else return false;14 }

登录将数据库中的盐值取出,和⽤户输⼊的密码按规则组合,进⾏摘要算法和Base64编码,得到密⽂密码,判断是否与数据库中的密⽂密码相等。 1 public boolean loginJudge(User user) { 2 String salt = SaltById(()); // 从数据库中查出对应盐值 3 if (salt == null) return false; // 若没有该id 说明⽤户不存在 4 StringBuilder sb = new StringBuilder(); 5 (sword()).append(salt); 6 byte[] password = est(ng()); 7 r encoder = oder(); 8 sword(ToString(password)); // 获取密⽂密码 9 int rs = UserByIdAndPassword(user);10 if (rs == 0) return false;11 else return true;12 }

关于摘要算法的选择

签名认证⼭东⼤学的王⼩云教授发布算法可以轻易构造MD5碰撞实例,此后,有国外学者在此算法基础上,提出了更进⼀步的MD5前缀碰撞构造算法"chosen prefix collision",⽽SHA1的碰撞实例也被⾕歌成功构造。因此在数字签名⽅⾯,对于数据完整性验证,应使⽤SHA256或更强的算法。

密码验证上述碰撞实例对密码加密并没有实质性的影响,加密需要考虑的⼀个问题在于,任何加密都⽆法避开暴⼒破解,那如何尽可能地提⾼暴⼒破解的难度?⼀个合理的思路是:提⾼加密的时间成本。基于这种思路,可以使⽤bcrypt算法,这种算法的优点是计算速度慢,还可以通过参数调节速度。对于登录验证,只需要通过多次调试,把速度控制在500ms左右,不会对⽤户影响造成体验,却能很⼤程度提⾼暴⼒破解的时间成本。

2023年7月31日发(作者:)

Web系统的密码加密问题(摘要算法)思路

盐值+MD5摘要算法1.为了防⽌字典破解(常⽤字符),先⽣成⼀个长度16位(位数最好和摘要算法的结果长度⼀致)的随机(安全随机数)byte数组作为盐值,通过Base64编码之后,将其和原密码按规则组合,保证进⾏摘要运算前的明⽂是⽆规律的。2.使⽤MD5摘要算法对明⽂进⾏运算得到⼀个长度16位的摘要byte数组,通过Base64编码后,得到⼀个24位的密⽂密码。

实现

⼯具类 1 public class PasswordProcessor { 2 public static void main(String[] args) { 3

4 } 5 public static byte[] makeSalt() { 6 SecureRandom secureRandom = null; 7 try { 8 secureRandom = tanceStrong(); // 尝试获取⾼强度安全随机数⽣成器 9 } catch (NoSuchAlgorithmException e) {10 secureRandom = new SecureRandom(); // 获取普通的安全随机数⽣成器11 }12 byte[] saltBuffer = new byte[16];13 tes(saltBuffer);14 return saltBuffer;15 }16

17 public static byte[] getDigest(String str) {18 MessageDigest md = null;19 try {20 md = tance("md5");21 } catch (NoSuchAlgorithmException e) {22 tackTrace();23 }24 byte[] digest = (es());25 return digest;26 }27 }

注册进⾏上述步骤,将盐值和密⽂密码分开存放。 1 public boolean signUpJudge(User user) { 2 r encoder = oder(); 3 byte[] salt = lt(); 4 String saltStr = ToString(salt); // 获取随机盐值 5 StringBuilder sb = new StringBuilder(); 6 (sword()).append(saltStr); 7 byte[] password = est(ng()); 8 sword(ToString(password)); // 获取密⽂密码 9 file("../images/profile/");10 int rs = User(user);11 int rs2 = Salt((), saltStr);12 if (rs == 1 && rs2 == 1) return true;13 else return false;14 }

登录将数据库中的盐值取出,和⽤户输⼊的密码按规则组合,进⾏摘要算法和Base64编码,得到密⽂密码,判断是否与数据库中的密⽂密码相等。 1 public boolean loginJudge(User user) { 2 String salt = SaltById(()); // 从数据库中查出对应盐值 3 if (salt == null) return false; // 若没有该id 说明⽤户不存在 4 StringBuilder sb = new StringBuilder(); 5 (sword()).append(salt); 6 byte[] password = est(ng()); 7 r encoder = oder(); 8 sword(ToString(password)); // 获取密⽂密码 9 int rs = UserByIdAndPassword(user);10 if (rs == 0) return false;11 else return true;12 }

关于摘要算法的选择

签名认证⼭东⼤学的王⼩云教授发布算法可以轻易构造MD5碰撞实例,此后,有国外学者在此算法基础上,提出了更进⼀步的MD5前缀碰撞构造算法"chosen prefix collision",⽽SHA1的碰撞实例也被⾕歌成功构造。因此在数字签名⽅⾯,对于数据完整性验证,应使⽤SHA256或更强的算法。

密码验证上述碰撞实例对密码加密并没有实质性的影响,加密需要考虑的⼀个问题在于,任何加密都⽆法避开暴⼒破解,那如何尽可能地提⾼暴⼒破解的难度?⼀个合理的思路是:提⾼加密的时间成本。基于这种思路,可以使⽤bcrypt算法,这种算法的优点是计算速度慢,还可以通过参数调节速度。对于登录验证,只需要通过多次调试,把速度控制在500ms左右,不会对⽤户影响造成体验,却能很⼤程度提⾼暴⼒破解的时间成本。