怎么把mysql数据库中现有的数据进行des加密,加密后的结果和java中des加密的结果一样。 如何用php实现和c#一致的DES加密解密

\u5229\u7528des\u7b97\u6cd5\u52a0\u5bc6double\u578b\u6570\u636e\uff0c\u52a0\u5bc6\u4e4b\u540e\u6570\u636e\u957f\u5ea6\u4f1a\u53d1\u751f\u53d8\u5316\u4e48

\u5206\u7ec4\u52a0\u5bc6\u7684\u5bc6\u6587\u7684\u957f\u5ea6\u548c\u586b\u5145\u540e\u7684\u660e\u6587\u957f\u5ea6\u76f8\u540c\uff0c\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316
3des\u7684\u5206\u7ec4\u5927\u5c0f\u548cDES\u76f8\u540c\uff0c\u90fd\u662f64bit\uff0c\u6240\u4ee5\u4e5f\u4e0d\u9700\u8981\u586b\u5145\u6570\u636e

\u5bf9\u4e8e\u8865\u5145\u7684\u95ee\u9898:
\u8fd9\u8981\u770b\u4f60\u5728\u7a0b\u5e8f\u91cc\u9762\u662f\u600e\u4e48\u5bf9\u8fd9\u4e2a\u6570\u636e\u8fdb\u884c\u5904\u7406\u4e86
\u56e0\u4e3a\u957f\u5ea6\u662f\u76f8\u540c\u7684\uff0c\u4f60\u53ef\u4ee5\u5bf9\u5176\u8fdb\u884c\u5f3a\u5236\u7684\u7c7b\u578b\u8f6c\u6362\uff0c\u5c06\u5176\u5f53\u6210double\u503c\u6765\u5904\u7406

\u4f7f\u7528\u8fd9\u4e2a\u7c7b\u5e94\u8be5\u53ef\u4ee5\u5b9e\u73b0\u7684\uff0c\u53ea\u4e0d\u4e0d\u8fc7\u4f60\u63d0\u51fa\u6587\u4ef6\u662f\u65e9\u671f\u7684DES,\u53ea\u80fd\u662f64bits\u52a0\u5fc5\uff0c\u800c\u73b0\u5728\u5374\u662f\u4e0d\u540c\u7684\uff0c\u5b83\u4e0enet2.0\u7248\u672c\u4e2d\u662f\u4e00\u81f4\u7684\uff0c\u800c\u662f\u9ad8\u7248\u672c\u4e2d\u5fc5\u987b\u8bbe\u7f6e\u8fd9\u51e0\u4e2a\u76f8\u5e94\u7684\u5c5e\u6027\u3002 \u8bf7\u67e5\u770b DESCryptoServiceProvider\u7c7b\u7684\u5b57\u6bb5\u6216\u5c5e\u6027\uff0c\u7136\u540e\u518d\u8fdb\u884c\u6d4b\u8bd5\u3002

最近需要对数据进行加密/解密, 因此选用了CryptoJS库, 对数据做DES算法的加密/解密

首选查看官方示例, 将密文进行Base64编码, 掉进一个大坑
<script src="htt p:/ /crypto-js.googlecod e.c om/svn/tags/3.1.2/build/rollups/tripledes.js"></script>
<script>
var encrypted = CryptoJS.DES.encrypt("Message", "Secret Passphrase");
// ciphertext changed every time you run it
// 加密的结果不应该每次都是一样的吗?
console.log(encrypted.toString(), encrypted.ciphertext.toString(CryptoJS.enc.Base64));
var decrypted = CryptoJS.DES.decrypt(encrypted, "Secret Passphrase");
console.log(decrypted.toString(CryptoJS.enc.Utf8));
</script>

对这些加密算法不了解, 只能求助Google
des encrypion: js encrypted value does not match the java encrypted value
In cryptoJS you have to convert the key to hex and useit as word just like above (otherwise it will be considered as passphrase)
For the key, when you pass a string, it's treated as a passphrase and used to derive an actual key and IV. Or you can pass a WordArray that represents the actual key.

原来是我指定key的方式不对, 直接将字符串做为参数, 想当然的以为这就是key, 其实不然, CryptoJS会根据这个字符串算出真正的key和IV(各种新鲜名词不解释, 问我也没用, 我也不懂 -_-")

那么我们只需要将key和iv对应的字符串转成CryptoJS的WordArray类型, 在DES加密时做为参数传入即可, 这样对Message这个字符串加密, 每次得到的密文都是YOa3le0I+dI=
var keyHex = CryptoJS.enc.Utf8.parse('abcd1234');
var ivHex = CryptoJS.enc.Utf8.parse('inputvec');
var encrypted = CryptoJS.DES.encrypt('Message', keyHex, { iv: ivHex });

这样是不是就万事OK了? 哪有, 谁知道这坑是一个接一个啊.
我们再试试Java这边的DES加密是不是和这个结果一样, 具体实现请参考Simple Java Class to DES Encrypt Strings

果真掉坑里了, Java通过DES加密Message这个字符串得到的结果是8dKft9vkZ4I=和CryptoJS算出来的不一样啊...亲

继续求助Google
C# and Java DES Encryption value are not identical
SunJCE provider uses ECB as the default mode, and PKCS5Padding as the default padding scheme for DES.(JCA Doc)
This means that in the case of the SunJCE provider,
Cipher c1 = Cipher.getInstance("DES/ECB/PKCS5Padding");
and
Cipher c1 = Cipher.getInstance("DES");
are equivalent statements.

原来是CryptoJS进行DES加密时, 默认的模式和padding方式和Java默认的不一样造成的, 必须使用ECB mode和PKCS5Padding, 但是CryptoJS中只有Pkcs7, 不管了, 试试看...
<script src="htt p:/ /crypto-js.googleco de.c om/svn/tags/3.1.2/build/rollups/tripledes.js"></script>
<script src="ht tp:/ /crypto-js.googleco de.c om/svn/tags/3.1.2/build/components/mode-ecb.js"></script>
<script>
var keyHex = CryptoJS.enc.Utf8.parse('abcd1234');
var encrypted = CryptoJS.DES.encrypt('Message', keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
console.log(encrypted.toString(), encrypted.ciphertext.toString(CryptoJS.enc.Base64));
</script>

咦...使用Pkcs7能得到和Java DES一样的结果了, 哇塞...好神奇
那我们试试统一Java也改成Cipher.getInstance("DES/ECB/PKCS7Padding")试试, 结果得到一个大大的错误
Error:java.security.NoSuchAlgorithmException: Cannot find any provider supporting DES/ECB/PKCS7Padding

没办法, 继续Google
java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/ECB/PKCS7PADDING
I will point out that PKCS#5 and PKCS#7 actually specify exactly the same type of padding (they are the same!), but it's called #5 when used in this context. :)

这位大侠给出的解释是: PKCS#5和PKCS#7是一样的padding方式, 对加密算法一知半解, 我也只能暂且认可这个解释了.

忙完了DES的加密, 接下来就是使用CryptoJS来解密了. 我们需要直接解密DES加密后的base64密文字符串. CryptoJS好像没有提供直接解密DES密文字符串的方法啊, 他的整个加密/解密过程都是内部自己在玩, 解密时需要用到加密的结果对象, 这不是坑我吗?

只好研究下CryptoJS DES加密后返回的对象, 发现有一个属性ciphertext, 就是密文的WordArray, 那么解密的时候, 我们是不是只要提供这个就行了呢?
var keyHex = CryptoJS.enc.Utf8.parse('abcd1234');
// direct decrypt ciphertext
var decrypted = CryptoJS.DES.decrypt({
ciphertext: CryptoJS.enc.Base64.parse('8dKft9vkZ4I=')
}, keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
console.log(decrypted.toString(CryptoJS.enc.Utf8));

果不其然, 到此为止, 问题全部解决, 豁然开朗...

完整代码请参考CryptoJS-DES.html
Use CryptoJS encrypt message by DES and direct decrypt ciphertext, compatible with Java Cipher.getInstance("DES")

下边是DES加密的方法。将数据进行DES加密,将加密内容转为16进制内容表示。
--------------------------------------------------------------------------------------------

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class DesTest {

public static void main(String[] args) throws Exception {
// 要加密的数据
String str = "123456";
// 密钥
String strKey = "86337898";

SecretKeySpec key = new SecretKeySpec(strKey.getBytes(), "DES");

Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] byteFina = cipher.doFinal(str.getBytes());
String strFinal = byte2Hex(byteFina);
System.out.println(strFinal);

cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decByte = hex2Byte(strFinal);
byte[] result = cipher.doFinal(decByte);

System.out.println(new String(result));

}

public static String byte2Hex(byte[] buff) {
String hs = "";
for (int i = 0; i < buff.length; i++) {
String stmp = (Integer.toHexString(buff[i] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
}
return hs;
}

public static byte[] hex2Byte(String str) {
int len = str.length() / 2;
byte[] buff = new byte[len];
int index = 0;
for (int i = 0; i < str.length(); i += 2) {
buff[index++] = (byte) Integer
.parseInt(str.substring(i, i + 2), 16);
}

return buff;
}

}

  • 鍙笉鍙互 鎶婁竴涓MySQL鏁版嵁搴撲腑鐨data瀵煎叆鍒板彟涓涓狹ySQL涓娇鐢
    绛旓細mysqldump瀵煎嚭mysql鍛戒护琛屽鍏ュ鏋滅増鏈浉鍚岋紝瀛楃闆嗙浉鍚岋紝鍙互鐩存帴鎸鏁版嵁搴鐩綍
  • 鎬庝箞鎶妋ysql涓殑鏁版嵁搴澶嶅埗鍒板彟涓鍙扮數鑴戠殑mysql涓?
    绛旓細鎷疯礉 net stop mysql cp -r /mysql /mysql 澶囦唤杩樺師 mysqldump -hlocalhost -uroot -p test > test.sql mysql -hlocalhost -uroot -p test < test.sql master/salve ETL鎸栨帢宸ュ叿鍚屾
  • 鍦mysql涓鎶婇噷闈㈢殑鏁版嵁搴澶囦唤鍒拌嚜宸辩殑纭洏涓
    绛旓細1 浣跨敤mysqldump澶囦唤鍜屾嫹璐鏁版嵁搴 褰撲綘浣跨敤mysqldumo绋嬪簭浜х敓鏁版嵁搴撳浠芥枃浠舵椂,缂虹渷鍦,鏂囦欢鍐呭鍖呭惈鍒涘缓姝e湪鍊惧掔殑琛ㄧ殑CREATE璇彞鍜屽寘鍚〃涓鏁版嵁鐨処NSERT璇彞銆傛崲鍙ヨ瘽璇,mysqldump浜х敓鐨勮緭鍑哄彲鍦ㄤ互鍚庣敤浣mysql鐨杈撳叆鏉ラ噸寤烘暟鎹簱銆 浣犲彲浠灏鏁翠釜鏁版嵁搴撳惧掕繘涓涓崟鐙殑鏂囨湰鏂囦欢涓,濡備笅: %mysqldump samp_db >/usr/...
  • 鎬庝箞鎭㈠mysql鏁版嵁搴撴庝箞鎭㈠鏁版嵁
    绛旓細鍗歌浇鍚庨噸瑁匨ySQL锛灏唌ysql\data鏂囦欢澶归噷鐨刢f1,last鏂囦欢澶癸紙杩欎袱涓槸鍘熸潵MySQL閲岀殑鏁版嵁搴锛夋嫹璐濊繘D:\Program Files\MySQL\MySQL Server 5.0\data銆傝繛鎺ユ垚鍔燂紝鍦∟avicat for MySQL閲岀湅鍒版暟鎹簱cf1鍜宭ast锛屼絾鏄笉鑳借闂紝鍥犱负鏁版嵁鍏ㄤ负闆躲傛槑鐧戒簡鍘熸潵data閲屼互鏁版嵁搴撳懡鍚嶇殑鏂囦欢瀛樺偍鐨勬槸鏁版嵁搴撶殑琛ㄧ粨鏋勶紝涓...
  • 濡備綍鍗曠嫭鎶婃暟鎹簱(mysql)涓殑琛ㄥ鍑,骞朵笖灏嗗鍑虹殑琛ㄥ鍏ュ埌铏氭嫙涓绘満鐨勬暟...
    绛旓細mysql鍟 浣犳湁ssh 鍚楋紵瑕佹槸鏈夌殑璇 鐢 mysqldump 鏉ュ埌澶 瑕佹槸娌℃湁鐨勮瘽 杩沵ysql 閲岄潰閫夌潃瑕佸鍑虹殑琛 瀵煎嚭灏辫鍟 鐒跺悗鍒拌櫄鎷熶富鏈虹殑璇 鏄笉鏄綘涓汉鐢佃剳鍟 鏄殑璇 杩涘叆 mysql 涓鏍风殑 瀵煎叆灏辫
  • 鏈夋病鏈夊姙娉灏嗙幇鏈mssql澶囦唤鏂囦欢bak鏍煎紡,瀵煎叆鍒mysql鏁版嵁搴撲腑
    绛旓細娌℃湁鐩存帴鐨勫伐鍏 1 鐢⊿QL Server鍏灏鍏ㄩ儴琛ㄤ笌瑙嗗浘鐢熸垚鑴氭湰 2 鍦∕ySQL涓婂垱寤哄叏閮ㄥ璞 3 瀹夎MySQL ODBC鐨勯┍鍔紝璁剧疆MySQL鏁版嵁婧 4 鐒跺悗鐢⊿QL Server鏁版嵁瀵煎嚭锛鎶婃暟鎹瀵煎叆鍒癕ySQL鏁版嵁
  • mysql鏁版嵁搴撴庝箞鎶鏌ヨ鍑烘潵鐨勬暟鎹敓鎴愪复鏃惰〃
    绛旓細濡傛灉涓存椂琛ㄥ緢灏忥紝鍙互鍒板唴瀛樹腑鍒涘缓锛屽惁鍒欏畠灏鍦ㄧ鐩樹笂鍒涘缓銆MySQL 鍦ㄥ唴瀛樹腑鍒涘缓浜嗕竴涓〃锛屽鏋滃畠鍙樺緱澶ぇ锛屽氨浼氳杞崲涓虹鐩樹笂瀛樺偍銆傚唴瀛樹复鏃惰〃鐨勬渶澶у肩敱 tmp_table_size 鎴 max_heap_table_size 鍊煎畾涔夛紝浠ヨ緝灏忚呬负鍑嗐侻ySQL 5.7 涓殑榛樿澶у皬涓 16MB銆傚鏋滆繍琛屾煡璇㈢殑鏁版嵁閲忚緝澶э紝鎴栬呭皻鏈煡璇...
  • mysql鏁翠釜鏁版嵁瀹屽叏澶囦唤銆 鍙笉鍙互鎶妋ysql鐨 data鐩綍涓嬬殑鏁版嵁鏂囦欢澶...
    绛旓細澶囦唤鏂规硶锛屽涓嬪弬鑰冿細1.棣栧厛鎵撳紑mysql鏁版嵁搴杞欢锛岃繘鍏ヨ蒋浠朵富鐣岄潰锛屽涓嬪浘銆2.鐒跺悗鍦ㄥ乏渚ф爲涓墦寮鏁版嵁搴擄紝濡備笅鍥俱3.鐒跺悗闇瑕佹寚瀹氳澶囦唤鐨勬暟鎹簱鐨勫悕绉帮紝濡備笅鍥俱4.鎵撳紑鏁版嵁搴撳悗鐨勭晫闈㈠鍥炬墍绀恒5.鐒跺悗闇瑕佸崟鍑籨umpSQL鏂囦欢閫夐」锛屽涓嬪浘銆6.鐒跺悗闇瑕佹墦寮閫夋嫨瀛樺偍鏂囦欢璺緞灞炲苟閫夋嫨淇濆瓨銆7. 鍗曞嚮鈥渟ave鈥...
  • 濡備綍灏唌ysql涓殑鏁版嵁瀵煎埌鍙︿竴涓mysql鏁版嵁搴撲腑?
    绛旓細灏辨槸鍜鏁版嵁搴琛ㄥ悕瀵瑰簲鐨.frm.myd.myi鏂囦欢锛夋嫹鍒板鍏ユ柟锛堟敞鎰忎竴涓〃鏈変笁涓枃浠)锛岀劧鍚庢敼涓涓嬫暟鎹〃鏂囦欢鍚嶆垚浣犺瀵煎叆鐨勮〃鍚嶏紝鐒跺悗鍚姩mysql鏈嶅姟 锛屽鏋滃鍏ユ柟鍘熸潵鐨勮〃鏈夋暟鎹紝鍙互鎶婂師鏉ョ殑鏁版嵁鐢ㄦ甯告柟寮忓鍑猴紝鐒跺悗鍦ㄥ伐鍏烽噷闈㈠鍏ュ悎骞跺氨鍙互浜嗭紝鍐嶆湁涓涓彲琛岀殑鏂规硶灏辨槸鑷啓浠g爜涓琛屼竴琛岀殑杞Щ鏁版嵁浜 ...
  • 鏈湴MySQL鏁版嵁搴撴庝箞涓庤繙绋婱ySQL鏁版嵁搴撳悓姝
    绛旓細涓鎬庢牱瀹炵幇涓や釜Mysql鏁版嵁搴涔嬮棿鐨勪富浠庡悓姝ャ備竴銆 姒傝堪 MySQL浠3.23.15鐗堟湰浠ュ悗鎻愪緵鏁版嵁搴撳鍒讹紙replication锛夊姛鑳斤紝鍒╃敤璇ュ姛鑳藉彲浠ュ疄鐜颁袱涓暟鎹簱鍚屾銆佷富浠庢ā寮忋佷簰鐩稿浠芥ā寮忕殑鍔熻兘銆傛湰鏂囨。涓昏闃愯堪浜濡備綍鍦╨inux绯荤粺涓埄鐢╩ysql鐨剅eplication杩涜鍙屾満鐑鐨勯厤缃備簩銆 鐜 鎿嶄綔绯荤粺锛歀inux 2.6.23....
  • 扩展阅读:mysql数据库面试题 ... mysql怎么创建数据表 ... mysql数据库创建学生表 ... mysql怎么查看创建的表 ... mysql如何删除数据库 ... 创建数据库四个步骤 ... mysql怎么把数据库导入 ... mysql数据库基础知识 ... mysql怎么把数据库导出来 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网