2010-07-06 59 views
2

我正在開發加密解密程序。 程序從用戶獲取輸入並對其進行加密。然後它將加密的數據存儲在ms訪問數據庫表中。 稍後,從表中檢索數據,解密並返回給用戶。檢索解密數據的問題

我將數據作爲文本存儲在ms訪問中。加密算法返回一個大小爲16的字節數組。 但是當我從數據庫中檢索數據時,我得到的只是一個大小爲8的字節數組。 幫我通過這個...

+0

您是否正在使用MS Crypto API,本地生成的方法或從網頁複製的算法? – 2010-07-06 22:32:20

+0

我正在使用AES算法。 – user384636 2010-07-09 05:35:32

+0

@ ur384636:忘記MS Crypto API,您可以通過將密碼字節轉換爲字符串並將結果字符串存儲在DB中的字符串字段中來解決您的問題。當你需要密文時,從DB讀取字符串,然後將其轉換爲字節。 要使用許多方法將字符串轉換爲字節並將字節轉換爲字符串,其中之一就是使用BASE64編碼器/解碼器,請參閱我的答案中的示例: http://stackoverflow.com/questions/3187166/解決數據/ 3187720問題#3187720 其他方式來存儲字節在「二進制字段」中的數據庫,也見我的回答, – 2010-07-09 06:33:39

回答

2

我認爲問題是,你正在使用它作爲文本,而它不是(它是二進制數據)。長度的減半聽起來像一個與Unicode相關的問題(即'文本'被存儲爲寬字符,字符爲兩個字節,但是每個字符只有一個字節被檢索)。

+0

謝謝,但有沒有任何兼容的數據類型存儲二進制數據? – user384636 2010-07-06 14:48:05

+1

使用BLOB存儲您的信息。 – Borealid 2010-07-06 22:36:13

+0

如果您在檢索和存儲數據時進行適當的轉換,則不需要使用BLOB字段。 – 2010-07-08 03:26:39

0

一個可能的解決方案是使用Base64編碼

可以使用Appache共享庫,爲密文爲字符串編碼: http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Base64.html

編輯: 我不知道爲什麼你要MS- ACCESS具體解決方案!在DMBS可能會改變,操作系統也可以改變..你必須編寫能夠在很多情況下工作,一般的解決辦法..

這裏小例子使用的Base64編碼器/解碼器:

import sun.misc.BASE64Decoder; 
import sun.misc.BASE64Encoder; 

import java.io.IOException ; 

public class Decoder { 
    public static void main(String[] args) throws IOException{ 
     byte[] cipherBytes = "stackoverflow".getBytes(); // say this the is encrypted bytes 

     String encodedBytes = new BASE64Encoder().encode(cipherBytes); 
     System.out.println("stored as: " + encodedBytes); 

     byte[] decodedBytes = new BASE64Decoder().decodeBuffer(encodedBytes); 
     System.out.println("extracted as: " + new String(decodedBytes)); 
    } 
} 

注意:此代碼使用內部Sun Classes(BASE64編碼器/解碼器),並且不推薦在您的程序中使用這些類,因爲它可能會在下一個版本的JDK中更改。

在Appache Commons中使用BASE64編碼器/解碼器更好。

,如果你想在MS-Access解決方案,儘量存放在LONGBINARY密文,看到這一點: How to specify blob type in MS Access?

+0

請注意他的標籤。這如何在MS Access中使用? – 2010-07-06 22:31:09

+0

如果您閱讀wiki文章:「base64通過數字處理編碼二進制數據」您想要存儲二進制數據嗎?有很多選項,第一個是將二進制文件存儲在「二進制字段」中是您使用的DBMS。第二個選項,我prefere,是將二進制數據(密文)轉換爲文本格式,然後將結果存儲在普通字符串字段中,就像存儲用戶名稱一樣。你可以通過使用Base64編碼來應用這一點,你編碼密文然後將其存儲在數據庫中。 當你想從數據庫的密文,你會執行相反的操作,解碼字符串。 – 2010-07-07 06:27:54

+0

如何在MS Access中使用它?也就是說,你對託尼詢問的迴應並不包括任何特定的訪問權限,而問題是關於訪問。 -1 – 2010-07-08 03:27:38

0

我有一個存儲使用MS加密接口加密的信用卡號碼的應用程序。我從MS知識庫中獲得了代碼,關鍵是在適當的位置運行ByteToString()和StringToByte()轉換。我將實際數據存儲在普通的Jet文本字段中,並且沒有任何問題。

+0

-1 ByteToString()和StringToByte()轉換與MS-ACCESS無關。這些是轉換器/編碼器方法,任何人都可以在不使用MS Crypto接口的情況下編寫類似的方法不要理解代碼的作用,不要使用/複製/粘貼代碼。 – 2010-07-08 08:45:42

+0

知識庫文章中有示例VB代碼,重點是如果您從字符串到字節和字節到字符串進行轉換,則使用文本數據類型來存儲加密值無關緊要。關鍵是你必須跟蹤你需要轉換的地方,這就是我引用我在Access中使用的方法的一點 - 不是因爲它是Access特定的,而是作爲你如何避免問題的例子您存儲加密值的數據類型。 – 2010-07-08 19:58:28

+0

您的權利,我同意你的意見。這個轉換工作(編碼器/解碼器)方法工作,最後他們從字節轉換爲字符串,從字符串轉換爲bytse ..請參閱我的答案中的示例。所以爲什麼你不喜歡我的答案,並減少它,而它對你的答案很熟悉,他們都從字節轉換爲字符串和從字符串轉換爲字節(而我的答案也比你的解決方案更好,因爲它獨立於MS-Crypto API)。在您減少/增加按鈕之前,請仔細考慮兩次,因爲這是不公平的。帶着敬意。 – 2010-07-09 06:15:06