MD5与Base64的思考

MD5加密是对任意长的数据使用MD5哈稀算法散列为4个32位组,若格式化为ASCII字符则为16字符,若格式化16进制表示,则为32字符.  (MD5的具体算法请参阅相关书籍和资料)

MD5广泛用于数据校验和完整性检验.且不可逆.理论上为抗碰撞

在2004年8月17日,MD5遭遇重创,山东大学的王小云做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告。(^_^如果大学选择继续读硕,我肯定会去考王小云的导师,呵)   看来MD5会正式让位于SHA1了.

回到正题,后来我发现在Asp.Net2.0自带的Membership中的用户密码可以使用MD5加密保存,而据我分析,其并非十六进制格式化字符串,而是采用Base64编码保存.

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。

Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。

这样一来,方案就基本定下来,MD5加密后再Base64编码.后来我又发现一
个问题,若单纯这样做,会有一个问题,那就是如果两个用户密码相同,就会导致在数据库中保存的数据一样, 
回想当初学认证理论的时候,讲过可以用盐值来解决这个问题,就是给每个用户生成一个随机的盐值,在作保存和校验时,需要把用户的Salt值加入到密码原文
中再作MD5运算,这样就可以使得相同的密码生成不同的编码.

OK,完.

转换后,我们用一个码表来得到我们想要的字符串(也就是最终的Base64编码),这个表是这样的:(摘自RFC2045)
Table 1: The Base64 Alphabet

Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y


文的字节数量应该是3的倍数啊,如果这个条件不能满足的话,那该怎么办呢?我们的解决办法是这样的:原文的字节不够的地方可以用全0来补足,转换时
Base64编码用=号来代替。这就是为什么有些Base64编码会以一个或两个等号结束的原因,但等号最多只有两个。因为:
余数 = 原文字节数 MOD 3
所以余数任何情况下都只可能是0,1,2这三个数中的一个。如果余数是0的话,就表示原文字节数正好是3的倍数(最理想的情况啦)。如果是1的话,为了让Base64编码是4的倍数,就要补2个等号;同理,如果是2的话,就要补1个等号。

时间: 2024-10-11 07:46:31

MD5与Base64的思考的相关文章

MD5和Base64

一. 简述 MD5: 全称为message digest algorithm 5(信息摘要算法), 可以进行加密, 但是不能解密, 属于单向加密, 通常用于文件校验 Base64: 把任意序列的8为字节描述为一种不易为人识别的形式, 通常用于邮件.http加密. 登陆的用户名和密码字段通过它加密, 可以进行加密和解密. 二. 代码 1. MD5: public class MD5Utils { /** * 使用md5的算法进行加密 * @param plainText 加密明文 * @retur

iOS常用加密方法(aes、md5、base64)

1.代码 iOS常用加密方法(aes.md5.base64) 1.AES加密 NSData+AES.h文件 // // NSData-AES.h // Smile // // Created by 周 敏 on 12-11-24. // Copyright (c) 2012年 BOX. All rights reserved. // #import <Foundation/Foundation.h> @class NSString; @interface NSData (Encryption)

iOS经常使用加密方式(MD5,AES,BASE64)与网络数据安全

演示样例项目下载地址  https://github.com/cerastes/Encryption 1MD5 创建MD5类 #import <Foundation/Foundation.h> @interface CJMD5 : NSObject +(NSString *)md5HexDigest:(NSString *)input; @end #import "CJMD5.h" #import <CommonCrypto/CommonDigest.h> @i

HttpPost,MD5,Base64等接口调用中会用到的方法

HttpPost调用方法: //url: 接口地址,param:类似key1=value1&key2=value2字符串 public static string WebRequestPost(string url, string param) { string strResult = ""; HttpWebRequest request = null; HttpWebResponse response = null; Stream stream = null; StreamR

在Java中使用MD5和BASE64

MD5: 在上一篇<Servlet的学习之Session(5)>中,为了能使获取的所有随机数都能有相同的位数,我们采用MD5获取随机数的消息摘要(或称数据指纹.数据摘要等等). MD5可以将所有的数字组合进行一个算法的运算得出一个新的数字组合,并且这个新的数字组合都是128位,也称为MD5码.MD5码是不可逆的,即无法通过MD5码来进行反向运算得到原始的数据.MD5的应用场合非常多,比如保存用户密码(防止数据库中用户密码被管理员看到,所以数据库中的密码不许使用明文密码),或者文件校验(防止下载

(转)angular进行md5加密 base64加密 哈希加密

原文地址:http://blog.csdn.net/liangsjss2011/article/details/58585739  (转) 引入文件encrypt.js 注入模块 var DiagnoseApp = angular.module('DiagnoseApp',['ui.router','ngCookies','ngFileUpload','Encrypt']); 引用 DiagnoseApp.controller('NavbarCtrl', function($scope, $ro

使用commons-codec包加密字符串(MD5,SHA1,BASE64)

1. [代码]MD5 String str = "abc"; DigestUtils.md5Hex(str); //附.net生成MD5的方法,生成内容跟java一致: String str = "abc"; FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5"); 2. [代码]SHA1 String str = "abc"; DigestUtil

基于Java语言的MD5加密Base64转换方法

提供了基于MD5加密16位和32位的方法 1 import java.io.IOException; 2 import java.math.BigInteger; 3 import java.security.MessageDigest; 4 import java.security.NoSuchAlgorithmException; 5 import sun.misc.BASE64Decoder; 6 import sun.misc.BASE64Encoder; 7 /** 8 * <p>标

iOS开发之MD5与Base64

1.MD5 MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5实现.将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2.MD3和MD4. MD5算法具有以下特点: 1.压缩性:任意长度的数据,算出的MD5值长度都是固定的. 2.容易计算:从原数据计算出MD5值很容易. 3.抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所