數據加密實例
目前IDEA在工程中已有大量應用實例,PGP(Pretty Good Privacy)就使用IDEA作為其分組加密演算法;安全套接字層SSL(Secure Socket Layer)也將IDEA包含在其加密演算法庫SSLRef中;IDEA演算法專利的所有者Ascom公司也推出了一系列基於IDEA演算法的安全產品,包括:基於IDEA的Exchange安全插件、IDEA加密晶元、IDEA加密軟體包等。IDEA演算法的應用和研究正在不斷走向成熟。
㈡ 如何對資料庫進行加密和解密
資料庫賬號密碼加密詳解及實例
資料庫中經常有對資料庫賬號密碼的加密,但是碰到一個問題,在使用UserService對密碼進行加密的時候,spring security 也是需要進行同步配置的,因為spring security 中驗證的加密方式是單獨配置的。如下:
<authentication-manager>
<authentication-provider user-service-ref="userDetailService">
<password-encoder ref="passwordEncoder" />
</authentication-provider>
</authentication-manager>
<beans:bean class="com.sapphire.security.MyPasswordEncoder" id="passwordEncoder">
<beans:constructor-arg value="md5"></beans:constructor-arg>
</beans:bean>
如上述配置文件所示,passwordEncoder才是在spring security對賬號加密校驗的地方。
spring security在攔截之後,會首先對用戶進行查找,通過自己定義的userDetailService來找到對應的用戶,然後由框架進行密碼的匹配驗證。
從userDetailService得到user以後,就會進入到DaoAuthenticationProvider中,這是框架中定義的 ,然後跳入其中的authenticate方法中。
該方法會進行兩個檢查,分別是
* preAuthenticationChecks : 主要進行的是對用戶是否過期等信息的校驗,調用的方法在userDetail中有定義的。
* : 這個就是用戶名密碼驗證的過程了。
而PasswordEncoder是我們xml中注入的bean,所以了,我們調用的則是我們自己完成的passwordEncoder
public class MyPasswordEncoder extends MessageDigestPasswordEncoder {
public MyPasswordEncoder(String algorithm) {
super(algorithm);
}
@Override
public boolean isPasswordValid(String encPass, String rawPass, Object salt) {
return encPass.equals(DigestUtils.md5DigestAsHex(rawPass.getBytes()));
}
}
這是我對其實現的一個簡單版本,調用的就是spring自帶的加密演算法,很簡單了,當然也可以使用復雜的加密方法,這個就靠自己了
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
㈢ 3DES的加密實例
classMycrypt3des{var$CI;public$key=keystring;/*構造方法*/function__construct(){$this->CI=&get_instance();}publicfunctionencrypt($input){//數據加密if(empty($input)){returnnull;}$size=mcrypt_get_block_size(MCRYPT_3DES,'ecb');$input=$this->pkcs5_pad($input,$size);$key=str_pad($this->key,24,'0');$td=mcrypt_mole_open(MCRYPT_3DES,'','ecb','');$iv=@mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND);@mcrypt_generic_init($td,$key,$iv);$data=mcrypt_generic($td,$input);mcrypt_generic_deinit($td);mcrypt_mole_close($td);$data=base64_encode($data);return$data;}publicfunctiondecrypt($encrypted){//數據解密if(!$encrypted||empty($encrypted)){returnnull;}$encrypted=base64_decode($encrypted);if(!$encrypted||empty($encrypted)){returnnull;}$key=str_pad($this->key,24,'0');$td=mcrypt_mole_open(MCRYPT_3DES,'','ecb','');$iv=@mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND);$ks=mcrypt_enc_get_key_size($td);@mcrypt_generic_init($td,$key,$iv);$decrypted=mdecrypt_generic($td,$encrypted);mcrypt_generic_deinit($td);mcrypt_mole_close($td);$y=$this->pkcs5_unpad($decrypted);return$y;}functionpkcs5_pad($text,$blocksize){$pad=$blocksize-(strlen($text)%$blocksize);return$text.str_repeat(chr($pad),$pad);}functionpkcs5_unpad($text){$pad=ord($text{strlen($text)-1});if($pad>strlen($text)){returnfalse;}if(strspn($text,chr($pad),strlen($text)-$pad)!=$pad){returnfalse;}returnsubstr($text,0,-1*$pad);}functionPaddingPKCS7($data){$block_size=mcrypt_get_block_size(MCRYPT_3DES,MCRYPT_MODE_CBC);$padding_char=$block_size-(strlen($data)%$block_size);$data.=str_repeat(chr($padding_char),$padding_char);return$data;}}
㈣ sql資料庫怎麼加密
SQL Server中的加密簡介
在SQL Server2000和以前的版本,是不支持加密的。所有的加密操作都需要在程序中完成。這導致一個問題,資料庫中加密的數據僅僅是對某一特定程序有意義,而另外的程序如果沒有對應的解密演算法,則數據變得毫無意義。
到了SQL Server2005,引入了列級加密。使得加密可以對特定列執行,這個過程涉及4對加密和解密的內置函數
SQL Server 2008時代,則引入的了透明數據加密(TDE),所謂的透明數據加密,就是加密在資料庫中進行,但從程序的角度來看就好像沒有加密一樣,和列級加密不同的是,TDE加密的級別是整個資料庫。使用TDE加密的資料庫文件或備份在另一個沒有證書的實例上是不能附加或恢復的。
㈤ 簡單文本文件的加密與解密。
給文件加密,我們公司使用的是超級加密3000軟體,這款軟體操作起來還是比較簡便的。
啟動超級加密3000進入軟體主界面,在軟體主窗口下方的的文件瀏覽控制項裡面選擇您需要加密的文件,然後點擊窗口上方的「數據加密」按鈕。
在彈出的數據加密窗口中輸入文件加密密碼,選擇合適的文件加密類型,然後點擊確定按鈕就可以了。
您可以使用這個方法給您的文件加密試試。
㈥ c語言字元串加密 多實例
string i;
int k;
cin>>i>>k;
for (int q=0;q<i.length();q++)
{
if (i[q]>='a'&& i[q]<='z')
i[q]=char((i[q]-'a'+k)%26+'a');
else
if (i[q]>='A'&&i[q]<='Z')
i[q]=char((i[q]-'A'+k)%26+'A');
}
㈦ asp.net程序加密資料庫中的密碼
●前言
我們知道,現在網路上一般的網站,稍微完善一點的,往往都需要用戶先注冊,提供諸如電子郵件、賬號、密碼等信息以後,成為網站欄目的注冊用戶,才可以享受網站一些特殊欄目提供的信息或者服務,比如免費電子郵件、論壇、聊天等,都需要用戶注冊。而對於電子商務網站,比如igo5等大型電子商務網站,用戶需要購買商品,就一定需要詳細而准確的注冊,而這些信息,往往是用戶很隱秘的信息,比如電話、電子郵件、地址等,所以,注冊信息對於用戶和網站都是很重要的資源,不能隨意透露,更加不能存在安全上的隱患。
如果我們也設計一個需要用戶注冊的網站,根據現在的常用技術實現方法,可以在資料庫中建立一個用於存放用戶信息的表,這個表中至少包括用戶賬號欄位:UserAccount和用戶密碼欄位:Password,當然,實際應用中一個用戶信息表不可能就只有這些信息,往往根據網站服務要求,會適當增加一些其他的信息,以方便網站提供更加完善的服務。一般的,一個用戶信息佔用這個用戶信息表的一行也就是一個數據記錄,當用戶登錄或者提交資料的時候,程序將用戶填寫的信息與表中的信息對照,如果用戶賬號和密碼都准確無誤,那麼說明這個用戶是合法用戶,通過注冊;反之,則是非法用戶,不許通過。
然而,是不是這樣就安全了了?是不是這樣就能滿足網站的注冊要求了呢?仔細想想,我們一般將用戶資料直接保存在資料庫中,並沒有進行任何的保密措施,對於一些文件型資料庫比如Access等,如果有人得到這個文件,豈不是所有的資料都泄露無疑?更加重要的是,如果一個不負責任的網管,不需要任何技術手段,就可以查看網站中的任何資料,如果我們的用戶信息在資料庫中沒有加密,對於網管而言,查看這些信息是太簡單了。所以,為了增加安全性,我們有必要對資料庫中的資料進行加密,這樣,即使有人得到了整個資料庫,如果沒有解密演算法,也一樣不能查看到資料庫中的用戶信息。但是,在考慮資料庫是否安全之前,我們有必要對我們的數據是否真的那麼重要進行考慮,如果數據只是簡單的一些文件資料,沒有保密的必要,顯然,沒有必要對這些數據進行加密而浪費系統資源、加重程序負擔,如果這些數據具有一定的隱私性,當然就有必要進行加密。所以,在考慮加密以前,我們可以對需要加密的數據做適當的選擇,以免浪費系統資源。
●MD5加密演算法簡單介紹
在現階段,我們一般認為存在兩種加密方式,單向加密和雙向加密。雙向加密是加密演算法中最常用的,它將我們可以直接理解的明文數據加密為我們不可直接理解的密文數據,然後,在需要的時候,可以使用一定的演算法將這些加密以後的密文解密為原來可以理解的明文。雙向加密適合於隱秘通訊,比如,我們在網上購物的時候,需要向網站提交信用卡密碼,我們當然不希望我們的數據直接在網上明文傳送,因為這樣很可能被別的用戶「偷聽」,我們希望我們的信用卡密碼是通過加密以後,再在網路傳送,這樣,網站接受到我們的數據以後,通過解密演算法就可以得到准確的信用卡賬號。
單向加密剛好相反,只能對數據進行加密,也就是說,沒有辦法對加密以後的數據進行解密。可能我們立即就會想,這樣的加密有什麼用處?不能解密的加密演算法有什麼作用呢?在實際中的一個應用就是資料庫中的用戶信息加密,當用戶創建一個新的賬號或者密碼,他的信息不是直接保存到資料庫,而是經過一次加密以後再保存,這樣,即使這些信息被泄露,也不能立即理解這些信息的真正含義。
MD5就是採用單向加密的加密演算法,對於MD5而言,有兩個特性是很重要的,第一是任意兩段明文數據,加密以後的密文不能是相同的;第二是任意一段明文數據,經過加密以後,其結果必須永遠是不變的。前者的意思是不可能有任意兩段明文加密以後得到相同的密文,後者的意思是如果我們加密特定的數據,得到的密文一定是相同的。
MD5CyptoServiceProvider類是.NET中System.Security.Cryptography名字空間的一個類,提供專門用於MD5單向數據加密的解決方法,也是本文中我們用來加密資料庫中密碼的類。在真正進行數據加密之前,我們首先來了解MD5CyptoServiceProvider類中的主要方法:ComputeHash,它將輸入的明文數據數組使用MD5加密以後輸出加密後的密文數據數組。現在,我們就來看一個具體的實例:
';要加密的明文字元串
Dim strPlainText as String = "Encrypt me!"
';用於存放明文字元串的數組
Dim hashedDataBytes as Byte()
Dim encoder as New UTF8Encoding()
';建立MD5CryptoService實例
Dim md5Hasher as New MD5CryptoServiceProvider()
';加密運算
hashedDataBytes = md5Hasher.ComputeHash(encoder.GetBytes(strPlainText))
看完以上的具體實例以後,我們知道,ComputeHash方法只能接受數組作為加密對象,輸出的密文也是數組,因此,在對字元串加密之前,我們必須首先將這些字元串轉化為數組,這就要用到UTF8Encoding類的GetBytes方法,將字元串轉化為數組,而加密以後的結果也是使用數組輸出。
以上我們大致了解了MD5的具體加密實現方法,下面,我們結合資料庫來看看MD5的實際使用。
●使用MD5存儲密碼
在前面的介紹中,我們提到網站往往將用戶的賬號、密碼等信息使用非加密的方式保存到資料庫,比如賬號使用類型為VarChar的UserCount欄位,同樣,密碼也是採用類型為VarChar的Password欄位。但是,如果我們打算採用MD5加密方式存儲密碼信息,就必須改變密碼欄位PassWord的類型為16為二進制方式,這個其實我們也不難理解,因為在前面的介紹中,我們知道加密以後的輸出,是使用二進制數組的,所以,這里必須做相應的改變。
當用戶注冊成功,正式建立一個賬號的時候,資料庫中就必須為這個用戶增加一條記錄。以下的程序代碼實現了建立一個賬號的功能,在頁面中,程序要求用戶輸入賬號、密碼等信息,然後,將這些信息作為賬號信息存入名為UserCount的數據表,在這個表中,用戶密碼是使用MD5加密保存的。下面就是實現以上頁面的具體代碼:
<%@ Import Namespace="System.Security.Cryptography" %>
<%@ Import Namespace="System.Text" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="server" language="VB">
Sub CreateAccount(sender as Object, e as EventArgs)
';1. 建立資料庫連接
Const strConnString as String = "connection string"
Dim objConn as New SqlConnection(strConnString)
';2. 建立Command對象
Dim strSQL as String = _
"INSERT INTO UserAccount(Username,Password) " & _
"VALUES(@Username, @Password)"
Dim objCmd as New SqlCommand(strSQL, objConn)
';3. SQL參數
Dim paramUsername as SqlParameter
paramUsername= New SqlParameter("@Username", SqlDbType.VarChar, 25)
paramUsername.Value = txtUsername.Text
objCmd.Parameters.Add(paramUsername)
';加密用戶密碼
Dim md5Hasher as New MD5CryptoServiceProvider()
Dim hashedBytes as Byte()
Dim encoder as New UTF8Encoding()
hashedBytes=md5Hasher.ComputeHash(encoder.GetBytes(txtPwd.Text))
Dim paramPwd as SqlParameter
paramPwd = New SqlParameter("@Password", SqlDbType.Binary, 16)
paramPwd.Value = hashedBytes
objCmd.Parameters.Add(paramPwd)
';加入資料庫
objConn.Open()
objCmd.ExecuteNonQuery()
objConn.Close()
End Sub
</script>
<form runat="server">
<h1>建立一個賬號</h1>
用戶名:<asp:TextBox runat="server" id="txtUsername" />
密碼:
<asp:TextBox runat="server" id="txtPwd" TextMode="Password" />
<p><asp:Button runat="server" Text="建立用戶賬號"
OnClick="CreateAccount" /></p>
</form>
在以上程序實現的頁面中,「用戶名」和「密碼」輸入框要求用戶輸入自己的賬號和密碼,用戶輸入自己的信息以後,按「建立用戶賬號」按鈕,就可以建立一個賬號並且存入資料庫。我們同時需要特別注意,因為以上的程序使用到了MD5加密和資料庫等功能,所以,在代碼最開頭,我們引入了幾個稍微特別一點的名字空間,這是不可缺少的。
我們可以看到,PassWord欄位的信息是二進制方式保存的,即使資料庫被人取得,也不可能知道密碼具體是什麼意思。當然,密碼也就不會泄露。
●使用MD5鑒別是否合法用戶
既然用戶密碼是按照MD5加密以後保存在資料庫中的,我們知道,MD5是單次加密演算法,所以,不可能將加密以後的信息轉為明文,也就是說,已經沒有辦法知道。這就出現一個問題,如果用戶使用賬號、密碼登錄,怎麼知道用戶提供的密碼是否准確呢?
這就不得不提到我們前文說到的MD5的特徵,我們知道,任意一段明文數據,經過加密以後,其結果必須永遠是不變的,也就是說,如果需要驗證用戶密碼是否正確,只需要將用戶當前提供的密碼使用MD5加密,然後和資料庫中保存的密碼欄位比較就可以了。以下代碼就可以實現這個功能:
<%@ Import Namespace="System.Security.Cryptography" %>
<%@ Import Namespace="System.Text" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="server" language="VB">
Sub Login(sender as Object, e as EventArgs)
';1. 建立資料庫連接
Const strConnString as String = "connection string"
Dim objConn as New SqlConnection(strConnString)
';2. 建立Command對象
Dim strSQL as String = "SELECT COUNT(*) FROM UserAccount " & _
"WHERE Username=@Username AND Password=@Password"
Dim objCmd as New SqlCommand(strSQL, objConn)
';3. SQL參數
Dim paramUsername as SqlParameter
paramUsername = New SqlParameter("@Username", SqlDbType.VarChar, 25)
paramUsername.Value = txtUsername.Text
objCmd.Parameters.Add(paramUsername)
';加密密碼信息
Dim md5Hasher as New MD5CryptoServiceProvider()
Dim hashedDataBytes as Byte()
Dim encoder as New UTF8Encoding()
hashedDataBytes = md5Hasher.ComputeHash(encoder.GetBytes(txtPwd.Text))
Dim paramPwd as SqlParameter
paramPwd = New SqlParameter("@Password", SqlDbType.Binary, 16)
paramPwd.Value = hashedDataBytes
objCmd.Parameters.Add(paramPwd)
objConn.Open()
Dim iResults as Integer = objCmd.ExecuteScalar()
objConn.Close()
If iResults = 1 then
';正確
Else
';錯誤
End If
End Sub
</script>
<form runat="server">
<h1>Login</h1>
用戶賬號: <asp:TextBox runat="server" id="txtUsername" />
密碼:
<asp:TextBox runat="server" id="txtPwd" TextMode="Password" />
<p><asp:Button runat="server" Text="Login" OnClick="登錄" />
</form>
●使用加密方式保存密碼到資料庫的限制
在決定是否使用加密方式保存密碼以前,我們還需要考慮一些問題。因為MD5是單次加密演算法,加密以後的信息不可以解密,所以,如果用戶丟失密碼,任何人都很難找到用戶原來的密碼,這時候,網站也就相應的失去一個很重要的功能,那就是用戶提供其他信息來取得忘記的密碼的功能,這不能不說是網站的一個大缺陷。另外,採用這樣的加密方式,必須完全修改以前的用戶資料,要求用戶完全重新注冊,這也是這種方法比較困難的一個地方。
●總結
以上我們詳細介紹了MD5加密用戶密碼的實現方法,同時,也介紹了採用加密密碼方式以後,用戶鑒別的實現。並討論了使用這種加密方式的應用限制。在實際應用中,我們可以將次方法做適當的修改和補充,以更加適合我們的應用需要
㈧ base64的加密解密例子
加密:
如:數據 1100 0001,1100 0010,1100 0011
3Byte的數據加密成4Byte數據,演算法是把3B(24bit)的數分為4組每組6bit,每組前面加2位0
110000=》0011 0000
011100=》0001 1100
001011=》0000 1011
000011=》0000 0011
解密就是 反過來算
㈨ 幫忙說一種加密方法實際應用的案例
md5的全稱是message-digest algorithm 5(信息-摘要演算法),在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest開發出來,經md2、md3和md4發展而來。它的作用是讓大容量信息在用數字簽名軟體簽署私人密匙前被"壓縮"成一種保密的格式(就是把一個任意長度的位元組串變換成一定長的大整數)。不管是md2、md4還是md5,它們都需要獲得一個隨機長度的信息並產生一個128位的信息摘要。雖然這些演算法的結構或多或少有些相似,但md2的設計與md4和md5完全不同,那是因為md2是為8位機器做過設計優化的,而md4和md5卻是面向32位的電腦。這三個演算法的描述和c語言源代碼在internet rfcs 1321中有詳細的描述(h++p://www.ietf.org/rfc/rfc1321.txt),這是一份最權威的文檔,由ronald l. rivest在1992年8月向ieft提交。
rivest在1989年開發出md2演算法。在這個演算法中,首先對信息進行數據補位,使信息的位元組長度是16的倍數。然後,以一個16位的檢驗和追加到信息末尾。並且根據這個新產生的信息計算出散列值。後來,rogier和chauvaud發現如果忽略了檢驗和將產生md2沖突。md2演算法的加密後結果是唯一的--既沒有重復。
為了加強演算法的安全性,rivest在1990年又開發出md4演算法。md4演算法同樣需要填補信息以確保信息的位元組長度加上448後能被512整除(信息位元組長度mod 512 = 448)。然後,一個以64位二進製表示的信息的最初長度被添加進來。信息被處理成512位damg?rd/merkle迭代結構的區塊,而且每個區塊要通過三個不同步驟的處理。den boer和bosselaers以及其他人很快的發現了攻擊md4版本中第一步和第三步的漏洞。dobbertin向大家演示了如何利用一部普通的個人電腦在幾分鍾內找到md4完整版本中的沖突(這個沖突實際上是一種漏洞,它將導致對不同的內容進行加密卻可能得到相同的加密後結果)。毫無疑問,md4就此被淘汰掉了。
盡管md4演算法在安全上有個這么大的漏洞,但它對在其後才被開發出來的好幾種信息安全加密演算法的出現卻有著不可忽視的引導作用。除了md5以外,其中比較有名的還有sha-1、ripe-md以及haval等。
一年以後,即1991年,rivest開發出技術上更為趨近成熟的md5演算法。它在md4的基礎上增加了"安全-帶子"(safety-belts)的概念。雖然md5比md4稍微慢一些,但卻更為安全。這個演算法很明顯的由四個和md4設計有少許不同的步驟組成。在md5演算法中,信息-摘要的大小和填充的必要條件與md4完全相同。den boer和bosselaers曾發現md5演算法中的假沖突(pseudo-collisions),但除此之外就沒有其他被發現的加密後結果了。
van oorschot和wiener曾經考慮過一個在散列中暴力搜尋沖突的函數(brute-force hash function),而且他們猜測一個被設計專門用來搜索md5沖突的機器(這台機器在1994年的製造成本大約是一百萬美元)可以平均每24天就找到一個沖突。但單從1991年到2001年這10年間,竟沒有出現替代md5演算法的md6或被叫做其他什麼名字的新演算法這一點,我們就可以看出這個瑕疵並沒有太多的影響md5的安全性。上面所有這些都不足以成為md5的在實際應用中的問題。並且,由於md5演算法的使用不需要支付任何版權費用的,所以在一般的情況下(非絕密應用領域。但即便是應用在絕密領域內,md5也不失為一種非常優秀的中間技術),md5怎麼都應該算得上是非常安全的了。
演算法的應用
md5的典型應用是對一段信息(message)產生信息摘要(message-digest),以防止被篡改。比如,在unix下有很多軟體在下載的時候都有一個文件名相同,文件擴展名為.md5的文件,在這個文件中通常只有一行文本,大致結構如:
md5 (tanajiya.tar.gz) =
這就是tanajiya.tar.gz文件的數字簽名。md5將整個文件當作一個大文本信息,通過其不可逆的字元串變換演算法,產生了這個唯一的md5信息摘要。如果在以後傳播這個文件的過程中,無論文件的內容發生了任何形式的改變(包括人為修改或者下載過程中線路不穩定引起的傳輸錯誤等),只要你對這個文件重新計算md5時就會發現信息摘要不相同,由此可以確定你得到的只是一個不正確的文件。如果再有一個第三方的認證機構,用md5還可以防止文件作者的"抵賴",這就是所謂的數字簽名應用。
md5還廣泛用於加密和解密技術上。比如在unix系統中用戶的密碼就是以md5(或其它類似的演算法)經加密後存儲在文件系統中。當用戶登錄的時候,系統把用戶輸入的密碼計算成md5值,然後再去和保存在文件系統中的md5值進行比較,進而確定輸入的密碼是否正確。通過這樣的步驟,系統在並不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統的合法性。這不但可以避免用戶的密碼被具有系統管理員許可權的用戶知道,而且還在一定程度上增加了密碼被破解的難度。
正是因為這個原因,現在被黑客使用最多的一種破譯密碼的方法就是一種被稱為"跑字典"的方法。有兩種方法得到字典,一種是日常搜集的用做密碼的字元串表,另一種是用排列組合方法生成的,先用md5程序計算出這些字典項的md5值,然後再用目標的md5值在這個字典中檢索。我們假設密碼的最大長度為8位位元組(8 bytes),同時密碼只能是字母和數字,共26+26+10=62個字元,排列組合出的字典的項數則是p(62,1)+p(62,2)….+p(62,8),那也已經是一個很天文的數字了,存儲這個字典就需要tb級的磁碟陣列,而且這種方法還有一個前提,就是能獲得目標賬戶的密碼md5值的情況下才可以。這種加密技術被廣泛的應用於unix系統中,這也是為什麼unix系統比一般操作系統更為堅固一個重要原因。
演算法描述
對md5演算法簡要的敘述可以為:md5以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組,經過了一系列的處理後,演算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位散列值。
在md5演算法中,首先需要對信息進行填充,使其位元組長度對512求余的結果等於448。因此,信息的位元組長度(bits length)將被擴展至n*512+448,即n*64+56個位元組(bytes),n為一個正整數。填充的方法如下,在信息的後面填充一個1和無數個0,直到滿足上面的條件時才停止用0對信息的填充。然後,在在這個結果後面附加一個以64位二進製表示的填充前信息長度。經過這兩步的處理,現在的信息位元組長度=n*512+448+64=(n+1)*512,即長度恰好是512的整數倍。這樣做的原因是為滿足後面處理中對信息長度的要求。
md5中有四個32位被稱作鏈接變數(chaining variable)的整數參數,他們分別為:a=0x01234567,b=0x89abcdef,c=0xfedcba98,d=0x76543210。
當設置好這四個鏈接變數後,就開始進入演算法的四輪循環運算。循環的次數是信息中512位信息分組的數目。
將上面四個鏈接變數復制到另外四個變數中:a到a,b到b,c到c,d到d。
主循環有四輪(md4隻有三輪),每輪循環都很相似。第一輪進行16次操作。每次操作對a、b、c和d中的其中三個作一次非線性函數運算,然後將所得結果加上第四個變數,文本的一個子分組和一個常數。再將所得結果向右環移一個不定的數,並加上a、b、c或d中之一。最後用該結果取代a、b、c或d中之一。
以一下是每次操作中用到的四個非線性函數(每輪一個)。
f(x,y,z) =(x&y)|((~x)&z)
g(x,y,z) =(x&z)|(y&(~z))
h(x,y,z) =x^y^z
i(x,y,z)=y^(x|(~z))
(&是與,|是或,~是非,^是異或)
這四個函數的說明:如果x、y和z的對應位是獨立和均勻的,那麼結果的每一位也應是獨立和均勻的。
f是一個逐位運算的函數。即,如果x,那麼y,否則z。函數h是逐位奇偶操作符。
假設mj表示消息的第j個子分組(從0到15),<<
ff(a,b,c,d,mj,s,ti)表示a=b+((a+(f(b,c,d)+mj+ti)<< gg(a,b,c,d,mj,s,ti)表示a=b+((a+(g(b,c,d)+mj+ti)<< hh(a,b,c,d,mj,s,ti)表示a=b+((a+(h(b,c,d)+mj+ti)<< ii(a,b,c,d,mj,s,ti)表示a=b+((a+(i(b,c,d)+mj+ti)<<
這四輪(64步)是:
第一輪
ff(a,b,c,d,m0,7,0xd76aa478)
ff(d,a,b,c,m1,12,0xe8c7b756)
ff(c,d,a,b,m2,17,0x242070db)
ff(b,c,d,a,m3,22,0xc1bdceee)
ff(a,b,c,d,m4,7,0xf57c0faf)
ff(d,a,b,c,m5,12,0x4787c62a)
ff(c,d,a,b,m6,17,0xa8304613)
ff(b,c,d,a,m7,22,0xfd469501)
ff(a,b,c,d,m8,7,0x698098d8)
ff(d,a,b,c,m9,12,0x8b44f7af)
ff(c,d,a,b,m10,17,0xffff5bb1)
ff(b,c,d,a,m11,22,0x895cd7be)
ff(a,b,c,d,m12,7,0x6b901122)
ff(d,a,b,c,m13,12,0xfd987193)
ff(c,d,a,b,m14,17,0xa679438e)
ff(b,c,d,a,m15,22,0x49b40821)
第二輪
gg(a,b,c,d,m1,5,0xf61e2562)
gg(d,a,b,c,m6,9,0xc040b340)
gg(c,d,a,b,m11,14,0x265e5a51)
gg(b,c,d,a,m0,20,0xe9b6c7aa)
gg(a,b,c,d,m5,5,0xd62f105d)
gg(d,a,b,c,m10,9,0x02441453)
gg(c,d,a,b,m15,14,0xd8a1e681)
gg(b,c,d,a,m4,20,0xe7d3fbc8)
gg(a,b,c,d,m9,5,0x21e1cde6)
gg(d,a,b,c,m14,9,0xc33707d6)
gg(c,d,a,b,m3,14,0xf4d50d87)
gg(b,c,d,a,m8,20,0x455a14ed)
gg(a,b,c,d,m13,5,0xa9e3e905)
gg(d,a,b,c,m2,9,0xfcefa3f8)
gg(c,d,a,b,m7,14,0x676f02d9)
gg(b,c,d,a,m12,20,0x8d2a4c8a)
第三輪
hh(a,b,c,d,m5,4,0xfffa3942)
hh(d,a,b,c,m8,11,0x8771f681)
hh(c,d,a,b,m11,16,0x6d9d6122)
hh(b,c,d,a,m14,23,0xfde5380c)
hh(a,b,c,d,m1,4,0xa4beea44)
hh(d,a,b,c,m4,11,0x4bdecfa9)
hh(c,d,a,b,m7,16,0xf6bb4b60)
hh(b,c,d,a,m10,23,0xbebfbc70)
hh(a,b,c,d,m13,4,0x289b7ec6)
hh(d,a,b,c,m0,11,0xeaa127fa)
hh(c,d,a,b,m3,16,0xd4ef3085)
hh(b,c,d,a,m6,23,0x04881d05)
hh(a,b,c,d,m9,4,0xd9d4d039)
hh(d,a,b,c,m12,11,0xe6db99e5)
hh(c,d,a,b,m15,16,0x1fa27cf8)
hh(b,c,d,a,m2,23,0xc4ac5665)
第四輪
ii(a,b,c,d,m0,6,0xf4292244)
ii(d,a,b,c,m7,10,0x432aff97)
ii(c,d,a,b,m14,15,0xab9423a7)
ii(b,c,d,a,m5,21,0xfc93a039)
ii(a,b,c,d,m12,6,0x655b59c3)
ii(d,a,b,c,m3,10,0x8f0ccc92)
ii(c,d,a,b,m10,15,0xffeff47d)
ii(b,c,d,a,m1,21,0x85845dd1)
ii(a,b,c,d,m8,6,0x6fa87e4f)
ii(d,a,b,c,m15,10,0xfe2ce6e0)
ii(c,d,a,b,m6,15,0xa3014314)
ii(b,c,d,a,m13,21,0x4e0811a1)
ii(a,b,c,d,m4,6,0xf7537e82)
ii(d,a,b,c,m11,10,0xbd3af235)
ii(c,d,a,b,m2,15,0x2ad7d2bb)
ii(b,c,d,a,m9,21,0xeb86d391)
常數ti可以如下選擇:
在第i步中,ti是4294967296*abs(sin(i))的整數部分,i的單位是弧度。(4294967296等於2的32次方)
所有這些完成之後,將a、b、c、d分別加上a、b、c、d。然後用下一分組數據繼續運行演算法,最後的輸出是a、b、c和d的級聯。
當你按照我上面所說的方法實現md5演算法以後,你可以用以下幾個信息對你做出來的程序作一個簡單的測試,看看程序有沒有錯誤。
md5 ("") =
md5 ("a") =
md5 ("abc") =
md5 ("message digest") =
md5 ("abcdefghijklmnopqrstuvwxyz") =
md5 ("") =
md5 ("
01234567890") =
如果你用上面的信息分別對你做的md5演算法實例做測試,最後得出的結論和標准答案完全一樣,那我就要在這里象你道一聲祝賀了。要知道,我的程序在第一次編譯成功的時候是沒有得出和上面相同的結果的。
md5的安全性
md5相對md4所作的改進:
1. 增加了第四輪;
2. 每一步均有唯一的加法常數;
3. 為減弱第二輪中函數g的對稱性從(x&y)|(x&z)|(y&z)變為(x&z)|(y&(~z));
4. 第一步加上了上一步的結果,這將引起更快的雪崩效應;
5. 改變了第二輪和第三輪中訪問消息子分組的次序,使其更不相似;
6. 近似優化了每一輪中的循環左移位移量以實現更快的雪崩效應。各輪的位移量互不相同。
[color=red]簡單的說:
MD5叫信息-摘要演算法,是一種密碼的演算法,它可以對任何文件產生一個唯一的MD5驗證碼,每個文件的MD5碼就如同每個人的指紋一樣,都是不同的,這樣,一旦這個文件在傳輸過程中,其內容被損壞或者被修改的話,那麼這個文件的MD5碼就會發生變化,通過對文件MD5的驗證,可以得知獲得的文件是否完整。
㈩ 怎樣在sql server2000中讓數據加密
SQL Server 2000的安全配置在進行SQL Server 2000資料庫的安全配置之前,首先你必須對操作系統進行安全配置,保證你的操作系統處於安全狀態。然後對你要使用的操作資料庫軟體(程序)進行必要的安全審核,比如對ASP、PHP等腳本,這是很多基於資料庫的WEB應用常出現的安全隱患,對於腳本主要是一個過濾問題,需要過濾一些類似 , 『 ; @ / 等字元,防止破壞者構造惡意的SQL語句。接著,安裝SQL Server2000後請打上補丁sp1,sp2以及最新的sp3,sp4。
在做完上面三步基礎之後,我們再來討論SQL Server的安全配置。
1、使用安全的密碼策略
我們把密碼策略擺在所有安全配置的第一步,請注意,很多資料庫帳號的密碼過於簡單,這跟系統密碼過於簡單是一個道理。對於sa更應該注意,同時不要讓sa帳號的密碼寫於應用程序或者腳本中。健壯的密碼是安全的第一步!SQL Server2000安裝的時候,如果是使用混合模式,那麼就需要輸入sa的密碼,除非你確認必須使用空密碼。這比以前的版本有所改進。同時養成定期修改密碼的好習慣。資料庫管理員應該定期查看是否有不符合密碼要求的帳號。
比如使用下面的SQL語句:
Use master
Select name,Password from syslogins where password is null
2、使用安全的帳號策略
由於SQL Server不能更改sa用戶名稱,也不能刪除這個超級用戶,所以,我們必須對這個帳號進行最強的保護,當然,包括使用一個非常強壯的密碼,最好不要在資料庫應用中使用sa帳號,只有當沒有其它方法登錄到 SQL Server 實例(例如,當其它系統管理員不可用或忘記了密碼)時才使用 sa。建議資料庫管理員新建立個擁有與sa一樣許可權的超級用戶來管理資料庫。安全的帳號策略還包括不要讓管理員許可權的帳號泛濫。
SQL Server的認證模式有Windows身份認證和混合身份認證兩種。如果資料庫管理員不希望操作系統管理員來通過操作系統登陸來接觸資料庫的話,可以在帳號管理中把系統帳號「BUILTIN\Administrators」刪除。不過這樣做的結果是一旦sa帳號忘記密碼的話,就沒有辦法來恢復了。很多主機使用資料庫應用只是用來做查詢、修改等簡單功能的,請根據實際需要分配帳號,並賦予僅僅能夠滿足應用要求和需要的許可權。比如,只要查詢功能的,那麼就使用一個簡單的public帳號能夠select就可以了。
3、加強資料庫日誌的記錄
審核資料庫登錄事件的「失敗和成功」,在實例屬性中選擇「安全性」,將其中的審核級別選定為全部,這樣在資料庫系統和操作系統日誌裡面,就詳細記錄了所有帳號的登錄事件。請定期查看SQL Server日誌檢查是否有可疑的登錄事件發生,或者使用DOS命令。findstr /C:"登錄" d:\Microsoft SQL Server\MSSQL\LOG\*.*
4、管理擴展存儲過程
對存儲過程進行大手術,並且對帳號調用擴展存儲過程的許可權要慎重。其實在多數應用中根本用不到多少系統的存儲過程,而SQL Server的這么多系統存儲過程只是用來適應廣大用戶需求的,所以請刪除不必要的存儲過程,因為有些系統的存儲過程能很容易地被人利用起來提升許可權或進行破壞。如果你不需要擴展存儲過程xp_cmdshell請把它去掉。使用這個SQL語句:
use master
sp_dropextendedproc 'xp_cmdshell'
xp_cmdshell是進入操作系統的最佳捷徑,是資料庫留給操作系統的一個大後門。如果你需要這個存儲過程,請用這個語句也可以恢復過來。
sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll'
如果你不需要請丟棄OLE自動存儲過程(會造成管理器中的某些特徵不能使用),
這些過程包括如下:
Sp_OACreate Sp_OADestroy Sp_OAGetErrorInfo Sp_OAGetProperty
Sp_OAMethod Sp_OASetProperty Sp_OAStop
去掉不需要的注冊表訪問的存儲過程,注冊表存儲過程甚至能夠讀出操作系統管理員的密碼來,如下:
Xp_regaddmultistring Xp_regdeletekey Xp_regdeletevalue
Xp_regenumvalues Xp_regread Xp_regremovemultistring
Xp_regwrite
還有一些其他的擴展存儲過程,你也最好檢查檢查。在處理存儲過程的時候,請確認一下,避免造成對資料庫或應用程序的傷害。
5、使用協議加密
SQL Server 2000使用的Tabular Data Stream協議來進行網路數據交換,如果不加密的話,所有的網路傳輸都是明文的,包括密碼、資料庫內容等等,這是一個很大的安全威脅。能被人在網路中截獲到他們需要的東西,包括資料庫帳號和密碼。所以,在條件容許情況下,最好使用SSL來加密協議,當然,你需要一個證書來支持。
6、不要讓人隨便探測到你的TCP/IP埠
默認情況下,SQL Server使用1433埠監聽,很多人都說SQL Server配置的時候要把這個埠改變,這樣別人就不能很容易地知道使用的什麼埠了。可惜,通過微軟未公開的1434埠的UDP探測可以很容易知道SQL Server使用的什麼TCP/IP埠了。不過微軟還是考慮到了這個問題,畢竟公開而且開放的埠會引起不必要的麻煩。在實例屬性中選擇TCP/IP協議的屬性。選擇隱藏 SQL Server 實例。如果隱藏了 SQL Server 實例,則將禁止對試圖枚舉網路上現有的 SQL Server 實例的客戶端所發出的廣播作出響應。這樣,別人就不能用1434來探測你的TCP/IP埠了(除非用Port Scan)。
7、修改TCP/IP使用的埠
請在上一步配置的基礎上,更改原默認的1433埠。在實例屬性中選擇網路配置中的TCP/IP協議的屬性,將TCP/IP使用的默認埠變為其他埠.
9、拒絕來自1434埠的探測
由於1434埠探測沒有限制,能夠被別人探測到一些資料庫信息,而且還可能遭到DOS攻擊讓資料庫伺服器的CPU負荷增大,所以對Windows 2000操作系統來說,在IPSec過濾拒絕掉1434埠的UDP通訊,可以盡可能地隱藏你的SQL Server。
10、對網路連接進行IP限制
SQL Server 2000資料庫系統本身沒有提供網路連接的安全解決辦法,但是Windows 2000提供了這樣的安全機制。使用操作系統自己的IPSec可以實現IP數據包的安全性。請對IP連接進行限制,只保證自己的IP能夠訪問,也拒絕其他IP進行的埠連接,把來自網路上的安全威脅進行有效的控制。