2012-10-02 77 views
1

我們有一個應用程序,它存儲一些本地數據,除了用戶和我們之外,這些數據都不會對任何人有價值。所以,我們不需要對它進行加密,但我們確實希望確保沒有人改變它。在移動設備上簽名和驗證配置文件(iOS + Android)

我想最簡單的方法是從文件內容,日期戳和/或大小生成一個散列。做直接的md5可能不夠好,因爲誰想改變數據只會產生一個新的散列,所以使用某種密鑰會很好。有沒有人知道一個簡單的方法來做到這一點?我想避免使用像crypto ++這樣的庫,但不是100%反對它。

哦,我們正在用C++來做這個應用程序。

也許,我只需要添加一些晦澀的數據到我們傳遞給md5函數的任何東西,並用這個來完成。你們有什麼感想?

只是爲了重申一下,文件沒有有價值的信息給黑客,所以沒有理由過度安全。我只是想檢查一下設置是否與之混淆。

謝謝, Angrius。

PS>有沒有人知道一個好的方法來實現md5這兩個工作?

回答

1

做我想做的最簡單的方法就是實現基本的HMAC(http://en.wikipedia.org/wiki/Hash-based_message_authentication_code)。你甚至可以將這個散列存儲在配置文件本身中,雖然這有點複雜,但很整潔。

原來,iOS和Android都內置庫來執行基本的SHA1,MD5等。他們也支持HMAC。因此,適用於iOS,你會做這樣的事情:

#include <CommonCrypto/CommonHMAC.h> 

string createHMAC(string key, string text) 
{ 
    string result; 

    const char *cKey = key.c_str(); 
    const char *cData = text.c_str(); 
    unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH]; 

    CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC); 

    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2]; 
    for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) 
    { 
     [output appendFormat:@"%02x", cHMAC[i]]; 
    } 
    result = string([output UTF8String]); 

    return result; 
} 

由於這是Objective-C代碼,你可以編譯這個客觀-C++,它會工作。如果您的應用不需要任何高級加密技術,則不需要使用任何框架。

乾杯, Angrius

2

如果要簽名數據,您需要使用密鑰和簽名算法。無論是像RSA這樣的不對稱的還是像AES這樣的對稱的。但是,如果您的應用需要使用該應用簽署數據,則需要將該密鑰嵌入或以其他方式提供給應用。在這種情況下,潛在的攻擊者可以從應用程序中提取它並創建自己的有效簽名。你決定你是否確定,以及你想保護它多遠。

添加'不明確的數據'或以其他方式試圖想出自己的算法是一個壞主意,你一定會弄錯它,特別是如果你沒有這方面的經驗。請使用標準算法,並考慮如何保護密鑰(使用iOS密鑰鏈等)。搜索「RSA sigantures」或「HMAC」以獲得更多關於如何在實踐中執行此操作的詳細信息。如果您無法利用C++庫(?)中的平臺加密API,則需要使用並鏈接到第三方庫(如OpenSSL)。

+0

感謝您的答覆,但我不是要保護數據,我只是想看看是否有人已經修改它。我會拒絕配置文件,如果它被修改並恢復到默認值。看來使用OpenSSL來做這件事會是一件矯枉過正的事情。 – SpaceBear

+0

如果不持有某種簽名密鑰(即使你在OP中這麼說),也無法確定它未被修改。 –

+0

是的,我想我會根據文件的元數據和一些私鑰生成md5,有點像這樣:http://en.wikipedia.org/wiki/Hash-based_message_authentication_code – SpaceBear

相關問題