mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-01 15:09:14 +00:00
[v2] improvements ('random_key' --> 'file_key', and etc)
* 'KEEP_ENC_REPO_PASSWD' --> 'SERVER_CRYPTO' * random_key --> file_key. added client_crypto.js * file upload/update: don't encrypt when file size is 0 * combine 'sjcl.min.js' and 'codecBytes.js' into 'sjcl.js' * added 'repo_create_js_fils.html', 'included' it
This commit is contained in:
62
media/js/client_crypto.js
Normal file
62
media/js/client_crypto.js
Normal file
@@ -0,0 +1,62 @@
|
||||
var salt = sjcl.codec.bytes.toBits([0xda, 0x90, 0x45, 0xc3, 0x06, 0xc7, 0xcc, 0x26]);
|
||||
|
||||
// gen magic_str
|
||||
function gen_magic_str(repo_id, passwd) {
|
||||
var magic_array = sjcl.misc.pbkdf2(repo_id + passwd, salt, 1000, 32*8, null);
|
||||
var magic_str = sjcl.codec.hex.fromBits(magic_array); //convert to hex
|
||||
return magic_str;
|
||||
}
|
||||
|
||||
function FileKey(passwd) {
|
||||
this.passwd = passwd;
|
||||
}
|
||||
FileKey.prototype.pre = function() {
|
||||
var passwd = this.passwd;
|
||||
|
||||
var key_array = sjcl.misc.pbkdf2(passwd, salt, 1000, 32*8, null);
|
||||
var iv_array = sjcl.misc.pbkdf2(key_array, salt, 10, 32*8, null);
|
||||
var key = sjcl.codec.hex.fromBits(key_array);
|
||||
var iv = sjcl.codec.hex.fromBits(iv_array);
|
||||
|
||||
return {key: key, iv:iv};
|
||||
};
|
||||
// generate an encrypted file key
|
||||
FileKey.prototype.gen_enc = function() {
|
||||
var file_key_array;
|
||||
if (window.crypto && window.crypto.getRandomValues) {
|
||||
file_key_array = new Uint32Array(8);
|
||||
window.crypto.getRandomValues(file_key_array);
|
||||
} else {
|
||||
file_key_array = [];
|
||||
for (var i = 0; i < 8; i++) {
|
||||
file_key_array.push(parseInt(Math.random() * Math.pow(2,32)));
|
||||
}
|
||||
}
|
||||
|
||||
var pre = this.pre();
|
||||
var key = pre.key, iv = pre.iv;
|
||||
|
||||
var encrypted_file_key_obj = CryptoJS.AES.encrypt(CryptoJS.lib.WordArray.create(file_key_array), CryptoJS.enc.Hex.parse(key), {iv: CryptoJS.enc.Hex.parse(iv)});
|
||||
var encrypted_file_key = encrypted_file_key_obj.ciphertext.toString(CryptoJS.enc.Hex); // convert to hex
|
||||
|
||||
return encrypted_file_key;
|
||||
};
|
||||
FileKey.prototype.decrypt = function(encrypted_file_key) {
|
||||
var pre = this.pre();
|
||||
var key = pre.key, iv = pre.iv;
|
||||
|
||||
var file_key_array = CryptoJS.AES.decrypt(CryptoJS.enc.Hex.parse(encrypted_file_key).toString(CryptoJS.enc.Base64), CryptoJS.enc.Hex.parse(key), {iv: CryptoJS.enc.Hex.parse(iv)});
|
||||
var file_key = file_key_array.toString(CryptoJS.enc.Hex);
|
||||
|
||||
return file_key;
|
||||
};
|
||||
|
||||
// gen key, iv: used in file encrypt/decrypt
|
||||
function gen_enc_key_iv(file_key) {
|
||||
var enc_key_array = sjcl.misc.pbkdf2(sjcl.codec.hex.toBits(file_key), salt, 1000, 32*8, null);
|
||||
var enc_iv_array = sjcl.misc.pbkdf2(enc_key_array, salt, 10, 32*8, null);
|
||||
var enc_key = sjcl.codec.hex.fromBits(enc_key_array);
|
||||
var enc_iv = sjcl.codec.hex.fromBits(enc_iv_array);
|
||||
|
||||
return {key: enc_key, iv:enc_iv};
|
||||
}
|
Reference in New Issue
Block a user