RSA AES 前端JS与后台JAVA的加密解密的是实现
AES CryptoJS
前提是编码方式,key,vi中设置一样,就可以进行跨语言加密解密
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
< link rel="stylesheet" href="<%=basePath %>/css/login.css"> < script src="<%=basePath %>jslib/jquery-1.8.3.js" type="text/javascript" ></ script > < script src="<%=basePath %>jslib/Common.js" type="text/javascript" ></ script > < script src="<%=basePath %>jslib/core-min.js" type="text/javascript" ></ script > < script src="<%=basePath %>jslib/aes.js" type="text/javascript" ></ script > </ head > < body > < form action="<%=basePath %>login?action=goAES" id="login" name="form" method="post"> < h1 >Log In</ h1 > < fieldset id="inputs"> < input id="name" type="text" placeholder="Username" value="" autofocus required> <!-- ming --> < input id="pwd" name="pwd" type="password" placeholder="Password" value="" required> </ fieldset > < fieldset id="actions"> < input type="button" id="button" onclick="go()" value="登 录"> < a href="#" id="msg"></ a > </ fieldset > < input type="hidden" name="key" id="key"> <!-- 密钥 --> < input type="hidden" id="msg_source" value="0807060504030201"> </ form > < script type="text/javascript"> function go(){ if(isEmptyById(['name','pwd'])){ $('#msg').text('用户名或密码不能为空'); return; } //var pwd = $("#pwd").val(); //console.info("加密前 : "+pwd); //CryptoJS.AES.encrypt('明文','key'); //var ecodeRestult = CryptoJS.AES.encrypt($("#pwd").val(),$("#msg_source").val()); //console.info("加密后 :"+ecodeRestult); //$("#pwd").val(ecodeRestult); //CryptoJS.AES.decrypt('密文','key').toString(CryptoJS.enc.Utf8); //var decodeResult = CryptoJS.AES.decrypt(ecodeRestult,$("#msg_source").val()).toString(CryptoJS.enc.Utf8); //console.info("解密后 :"+decodeResult); var pwd = $("#pwd").val(); var key = CryptoJS.enc.Utf8.parse($("#msg_source").val()); var iv = CryptoJS.enc.Utf8.parse($("#msg_source").val()); var srcs = CryptoJS.enc.Utf8.parse(pwd); var encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv,mode:CryptoJS.mode.CBC}); $("#pwd").val(encrypted); $('#login').submit(); } </ script > |
这里需要注意的是$("#msg_source").val(); 因为key是动态的,需要从服务器提前设置好,前端AES JS加密指定是CryptoJS.mode.CBC模式,那么Java解密的同时也必须用这个模式来解密,不然会报错Given final block not properly padded...异常
AES--Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
package org.common.kit; import org.apache.log4j.Logger; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; public class AESKit { /** * Logger for this class */ private static final Logger logger = Logger.getLogger(AESKit. class ); public static final String IV = "0807060504030201" ; /******************************************************************* * AES加密算法 * @author moyun * 加密用的Key 可以用26个字母和数字组成,最好不要用保留字符,虽然不会错,至于怎么裁决,个人看情况而定 此处使用AES-128-CBC加密模式,key需要为16位。 * */ //加密 public static String Encrypt(String sSrc, String sKey) throws Exception { if (sKey == null ) { System.out.print( "Key为空null" ); return null ; } // 判断Key是否为16位 if (sKey.length() != 16 ) { System.out.print( "Key长度不是16位" ); return null ; } byte [] raw = sKey.getBytes(); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES" ); Cipher cipher = Cipher.getInstance( "AES/CBC/PKCS5Padding" ); //"算法/模式/补码方式" IvParameterSpec iv = new IvParameterSpec(IV.getBytes()); //使用CBC模式,需要一个向量iv,可增加加密算法的强度 cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); byte [] encrypted = cipher.doFinal(sSrc.getBytes()); return Base64.encodeBase64String(encrypted); //此处使用BAES64做转码功能,同时能起到2次 } //解密 public static String Decrypt(String sSrc, String sKey) throws Exception { // 判断Key是否正确 if (sKey == null ) { System.out.print( "Key为空null" ); return null ; } // 判断Key是否为16位 if (sKey.length() != 16 ) { System.out.print( "Key长度不是16位" ); return null ; } byte [] raw = sKey.getBytes( "ASCII" ); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES" ); Cipher cipher = Cipher.getInstance( "AES/CBC/PKCS5Padding" ); IvParameterSpec iv = new IvParameterSpec(IV.getBytes()); cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); byte [] encrypted1 = Base64.decodeBase64(sSrc); //先用bAES64解密 try { byte [] original = cipher.doFinal(encrypted1); String originalString = new String(original); return originalString; } catch (Exception e) { logger.info(e.toString()); return null ; } } public static void main(String[] args) throws Exception { String pwd = "世界你好" ; String epwd = Encrypt(pwd, "abcdefghijkmlnsf" ); System.out.println(epwd); System.out.println(Decrypt(epwd, "abcdefghijkmlnsf" )); } } |
RSA RSAUtils js
1 <link rel="stylesheet" href="<%=basePath %>/css/login.css">
2 <script src="<%=basePath %>jslib/security.js" type="text/javascript"></script>
3 <script src="<%=basePath %>jslib/jquery-1.8.3.js" type="text/javascript" ></script>
4 <script src="<%=basePath %>jslib/Common.js" type="text/javascript" ></script>
5 </head>
6 <body>
7
8 <form action="<%=basePath %>login?action=go" id="login" name="form" method="post">
9 <h1>Log In</h1>
10 <fieldset id="inputs">
11 <input id="name" type="text" placeholder="Username" value="" autofocus required>
12 <input id="pwd" type="password" placeholder="Password" value="" required>
13 </fieldset>
14 <fieldset id="actions">
15 <input type="button" id="button" onclick="go()" value="登 录">
16 <a href="#" id="msg"></a>
17 </fieldset>
18 <input type="hidden" name="modulus" id="hid_modulus" value="${modulus }">
19 <input type="hidden" name="exponent" id="hid_exponent" value="${exponent }">
20 <input type="hidden" name="key" id="key">
21 </form>
22
23 <script type="text/javascript">
24
25 function go(){
26
27 if(isEmptyById(['name','pwd'])){
28 $('#msg').text('用户名或密码不能为空');
29 return;
30 }
31 var modulus = $('#hid_modulus').val(), exponent = $('#hid_exponent').val();
32 var key = RSAUtils.getKeyPair(exponent, '', modulus);
33 var key2="name="+$('#name').val()+"&pwd="+$('#pwd').val();
34 $('#key').val(RSAUtils.encryptedString(key, key2));
35 $('#login').submit();
36 }
37 </script>
1 package org.common.kit;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.FileOutputStream;
6 import java.io.ObjectInputStream;
7 import java.io.ObjectOutputStream;
8 import java.math.BigInteger;
9 import java.security.InvalidParameterException;
10 import java.security.KeyFactory;
11 import java.security.KeyPair;
12 import java.security.KeyPairGenerator;
13 import java.security.NoSuchAlgorithmException;
14 import java.security.PrivateKey;
15 import java.security.Provider;
16 import java.security.PublicKey;
17 import java.security.SecureRandom;
18 import java.security.interfaces.RSAPrivateKey;
19 import java.security.interfaces.RSAPublicKey;
20 import java.security.spec.InvalidKeySpecException;
21 import java.security.spec.RSAPrivateKeySpec;
22 import java.security.spec.RSAPublicKeySpec;
23 import java.util.Date;
24
25 import javax.crypto.Cipher;
26
27 import org.apache.commons.codec.DecoderException;
28 import org.apache.commons.codec.binary.Hex;
29 import org.apache.commons.io.FileUtils;
30 import org.apache.commons.io.IOUtils;
31 import org.apache.commons.lang3.StringUtils;
32 import org.apache.commons.lang3.time.DateFormatUtils;
33 import org.apache.log4j.Logger;
34 import org.bouncycastle.jce.provider.BouncyCastleProvider;
35
36 public abstract class RSA
37 {
38
39 private static final Logger LOGGER = Logger.getLogger(RSA.class);
40
41 private static final String ALGORITHOM = "RSA";
42 private static final String RSA_PAIR_FILENAME = "/__RSA_PAIR.txt";
43 private static final int KEY_SIZE = 1024;
44 private static final Provider DEFAULT_PROVIDER = new BouncyCastleProvider();
45
46 private static KeyPairGenerator keyPairGen = null;
47 private static KeyFactory keyFactory = null;
48
49 private static KeyPair oneKeyPair = null;
50
51 private static File rsaPairFile = null;
52
53 static
54 {
55 try
56 {
57 keyPairGen = KeyPairGenerator.getInstance("RSA", DEFAULT_PROVIDER);
58 keyFactory = KeyFactory.getInstance("RSA", DEFAULT_PROVIDER);
59 } catch (NoSuchAlgorithmException ex)
60 {
61 LOGGER.error(ex.getMessage());
62 }
63 rsaPairFile = new File(getRSAPairFilePath());
64 }
65
66 /***
67 *
68 * 返回 解码后的 username pwd
69 *
70 * add by 12
71 *
72 * @param key
73 * @return
74 */
75 public static String[] decryptUsernameAndPwd(String key)
76 {
77
78 key = RSA.decryptStringByJs(key);
79
80 try
81 {
82 String username = key.substring(key.indexOf("=") + 1, key.indexOf("&"));
83 String pwd = key.substring(key.lastIndexOf("=") + 1, key.length());
84 return new String[] { username, pwd };
85 } catch (Exception e)
86 {
87 return null;
88 }
89
90 }
91
92 private static synchronized KeyPair generateKeyPair()
93 {
94 try
95 {
96 keyPairGen.initialize(1024, new SecureRandom(DateFormatUtils.format(new Date(), "yyyyMMdd").getBytes()));
97 oneKeyPair = keyPairGen.generateKeyPair();
98 saveKeyPair(oneKeyPair);
99 return oneKeyPair;
100 } catch (InvalidParameterException ex)
101 {
102 LOGGER.error("KeyPairGenerator does not support a key length of 1024.", ex);
103 } catch (NullPointerException ex)
104 {
105 LOGGER.error("RSAUtils#KEY_PAIR_GEN is null, can not generate KeyPairGenerator instance.", ex);
106 }
107 return null;
108 }
109
110 private static String getRSAPairFilePath()
111 {
112 String urlPath = RSA.class.getResource("/").getPath();
113 String str = new File(urlPath).getParent() + "/__RSA_PAIR.txt";
114
115 urlPath = null;
116
117 return str;
118 }
119
120 private static boolean isCreateKeyPairFile()
121 {
122 boolean createNewKeyPair = false;
123 if ((!rsaPairFile.exists()) || (rsaPairFile.isDirectory()))
124 {
125 createNewKeyPair = true;
126 }
127 return createNewKeyPair;
128 }
129
130 private static void saveKeyPair(KeyPair keyPair)
131 {
132 FileOutputStream fos = null;
133 ObjectOutputStream oos = null;
134 try
135 {
136 fos = FileUtils.openOutputStream(rsaPairFile);
137 oos = new ObjectOutputStream(fos);
138 oos.writeObject(keyPair);
139 } catch (Exception ex)
140 {
141 ex.printStackTrace();
142 } finally
143 {
144 IOUtils.closeQuietly(oos);
145 IOUtils.closeQuietly(fos);
146 }
147
148 fos = null;
149 oos = null;
150 }
151
152 public static KeyPair getKeyPair()
153 {
154 if (isCreateKeyPairFile()) { return generateKeyPair(); }
155 if (oneKeyPair != null) { return oneKeyPair; }
156 return readKeyPair();
157 }
158
159 private static KeyPair readKeyPair()
160 {
161 FileInputStream fis = null;
162 ObjectInputStream ois = null;
163 try
164 {
165 fis = FileUtils.openInputStream(rsaPairFile);
166 ois = new ObjectInputStream(fis);
167 oneKeyPair = (KeyPair) ois.readObject();
168 return oneKeyPair;
169 } catch (Exception ex)
170 {
171 ex.printStackTrace();
172 } finally
173 {
174 IOUtils.closeQuietly(ois);
175 IOUtils.closeQuietly(fis);
176 }
177
178 fis = null;
179 ois = null;
180 return null;
181 }
182
183 public static RSAPublicKey generateRSAPublicKey(byte[] modulus, byte[] publicExponent)
184 {
185 RSAPublicKeySpec publicKeySpec = new RSAPublicKeySpec(new BigInteger(modulus), new BigInteger(publicExponent));
186 try
187 {
188 return (RSAPublicKey) keyFactory.generatePublic(publicKeySpec);
189 } catch (InvalidKeySpecException ex)
190 {
191 LOGGER.error("RSAPublicKeySpec is unavailable.", ex);
192 } catch (NullPointerException ex)
193 {
194 LOGGER.error("RSAUtils#KEY_FACTORY is null, can not generate KeyFactory instance.", ex);
195 }
196 publicKeySpec = null;
197 modulus = (byte[]) null;
198 publicExponent = (byte[]) null;
199 return null;
200 }
201
202 public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus, byte[] privateExponent)
203 {
204 RSAPrivateKeySpec privateKeySpec = new RSAPrivateKeySpec(new BigInteger(modulus), new BigInteger(privateExponent));
205 try
206 {
207 return (RSAPrivateKey) keyFactory.generatePrivate(privateKeySpec);
208 } catch (InvalidKeySpecException ex)
209 {
210 LOGGER.error("RSAPrivateKeySpec is unavailable.", ex);
211 } catch (NullPointerException ex)
212 {
213 LOGGER.error("RSAUtils#KEY_FACTORY is null, can not generate KeyFactory instance.", ex);
214 }
215 privateKeySpec = null;
216 modulus = (byte[]) null;
217 privateExponent = (byte[]) null;
218 return null;
219 }
220
221 public static RSAPrivateKey getRSAPrivateKey(String hexModulus, String hexPrivateExponent)
222 {
223 if ((StringUtils.isBlank(hexModulus)) || (StringUtils.isBlank(hexPrivateExponent)))
224 {
225 if (LOGGER.isDebugEnabled())
226 {
227 LOGGER.debug("hexModulus and hexPrivateExponent cannot be empty. RSAPrivateKey value is null to return.");
228 }
229 return null;
230 }
231 byte[] modulus = (byte[]) null;
232 byte[] privateExponent = (byte[]) null;
233 try
234 {
235 modulus = Hex.decodeHex(hexModulus.toCharArray());
236 privateExponent = Hex.decodeHex(hexPrivateExponent.toCharArray());
237 } catch (DecoderException ex)
238 {
239 LOGGER.error("hexModulus or hexPrivateExponent value is invalid. return null(RSAPrivateKey).");
240 }
241 if ((modulus != null) && (privateExponent != null)) { return generateRSAPrivateKey(modulus, privateExponent); }
242 return null;
243 }
244
245 public static RSAPublicKey getRSAPublidKey(String hexModulus, String hexPublicExponent)
246 {
247 if ((StringUtils.isBlank(hexModulus)) || (StringUtils.isBlank(hexPublicExponent)))
248 {
249 if (LOGGER.isDebugEnabled())
250 {
251 LOGGER.debug("hexModulus and hexPublicExponent cannot be empty. return null(RSAPublicKey).");
252 }
253 return null;
254 }
255 byte[] modulus = (byte[]) null;
256 byte[] publicExponent = (byte[]) null;
257 try
258 {
259 modulus = Hex.decodeHex(hexModulus.toCharArray());
260 publicExponent = Hex.decodeHex(hexPublicExponent.toCharArray());
261 } catch (DecoderException ex)
262 {
263 LOGGER.error("hexModulus or hexPublicExponent value is invalid. return null(RSAPublicKey).");
264 }
265 if ((modulus != null) && (publicExponent != null)) { return generateRSAPublicKey(modulus, publicExponent); }
266 return null;
267 }
268
269 public static byte[] encrypt(PublicKey publicKey, byte[] data) throws Exception
270 {
271 Cipher ci = Cipher.getInstance("RSA", DEFAULT_PROVIDER);
272 ci.init(1, publicKey);
273 return ci.doFinal(data);
274 }
275
276 public static byte[] decrypt(PrivateKey privateKey, byte[] data) throws Exception
277 {
278 Cipher ci = Cipher.getInstance("RSA", DEFAULT_PROVIDER);
279 ci.init(2, privateKey);
280 return ci.doFinal(data);
281 }
282
283 public static String encryptString(PublicKey publicKey, String plaintext)
284 {
285 if ((publicKey == null) || (plaintext == null)) { return null; }
286 byte[] data = plaintext.getBytes();
287 try
288 {
289 byte[] en_data = encrypt(publicKey, data);
290 return new String(Hex.encodeHex(en_data));
291 } catch (Exception ex)
292 {
293 LOGGER.error(ex.getCause().getMessage());
294 }
295 return null;
296 }
297
298 public static String encryptString(String plaintext)
299 {
300 if (plaintext == null) { return null; }
301 byte[] data = plaintext.getBytes();
302 KeyPair keyPair = getKeyPair();
303 try
304 {
305 byte[] en_data = encrypt((RSAPublicKey) keyPair.getPublic(), data);
306 return new String(Hex.encodeHex(en_data));
307 } catch (NullPointerException ex)
308 {
309 LOGGER.error("keyPair cannot be null.");
310 } catch (Exception ex)
311 {
312 LOGGER.error(ex.getCause().getMessage());
313 }
314 return null;
315 }
316
317 public static String decryptString(PrivateKey privateKey, String encrypttext)
318 {
319 if ((privateKey == null) || (StringUtils.isBlank(encrypttext))) return null;
320 try
321 {
322 byte[] en_data = Hex.decodeHex(encrypttext.toCharArray());
323 byte[] data = decrypt(privateKey, en_data);
324 return new String(data);
325 } catch (Exception ex)
326 {
327 LOGGER.error(String.format("\"%s\" Decryption failed. Cause: %s", new Object[] { encrypttext, ex.getCause().getMessage() }));
328 }
329 return null;
330 }
331
332 public static String decryptString(String encrypttext)
333 {
334 if (StringUtils.isBlank(encrypttext)) { return null; }
335 KeyPair keyPair = getKeyPair();
336 try
337 {
338 byte[] en_data = Hex.decodeHex(encrypttext.toCharArray());
339 byte[] data = decrypt((RSAPrivateKey) keyPair.getPrivate(), en_data);
340 return new String(data);
341 } catch (NullPointerException ex)
342 {
343 LOGGER.error("keyPair cannot be null.");
344 } catch (Exception ex)
345 {
346 LOGGER.error(String.format("\"%s\" Decryption failed. Cause: %s", new Object[] { encrypttext, ex.getMessage() }));
347 }
348 return null;
349 }
350
351 public static String decryptStringByJs(String encrypttext)
352 {
353 String text = decryptString(encrypttext);
354 if (text == null) { return null; }
355 return StringUtils.reverse(text);
356 }
357
358 public static RSAPublicKey getDefaultPublicKey()
359 {
360 KeyPair keyPair = getKeyPair();
361 if (keyPair != null) { return (RSAPublicKey) keyPair.getPublic(); }
362 return null;
363 }
364
365 public static RSAPrivateKey getDefaultPrivateKey()
366 {
367 KeyPair keyPair = getKeyPair();
368 if (keyPair != null) { return (RSAPrivateKey) keyPair.getPrivate(); }
369 return null;
370 }
371 }
RSA AES 前端JS与后台JAVA的加密解密的是实现的更多相关文章
- C#与Java同步加密解密DES算法
在实际项目中,往往前端和后端使用不同的语言.比如使用C#开发客户端,使用Java开发服务器端.有时出于安全性考虑需要将字符加密传输后,由服务器解密获取.本文介绍一种采用DES算法的C#与Java同步加 ...
- java字符串加密解密
java字符串加密解密 字符串加密解密的方式很多,每一种加密有着相对的解密方法.下面要说的是java中模拟php的pack和unpack的字符串加密解密方法. java模拟php中pack: /** ...
- 前端js,后台python实现RSA非对称加密
先熟悉使用 在后台使用RSA实现秘钥生产,加密,解密; # -*- encoding:utf-8 -*- import base64 from Crypto import Random from Cr ...
- jeecg中ajax传值的前端js和后台代码
前端js: var b=1; $.ajax({ type : "POST", --Post请求方式 url : 'orderController.do?wuliao', --路径 ...
- json处理总结(前端js和后端java)
前端(js): json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键,下面将介绍两者之间的相互转换. json字符串:var st ...
- 通用RSA加密 - PHP+Java+Javascript加密解密
php端生成 公钥私钥 1.openssl genrsa -out rsa_private_key.pem 1024 私钥 2.openssl rsa -in rsa_private_key.p ...
- JAVA中使用RSA通过秘钥文件对字符串进行加密解密
技术交流群: 233513714 //字符串进行加密算法的名称 public static final String ALGORITHM = "RSA"; //字符串进行加密填充的 ...
- JAVA常用加密解密算法Encryption and decryption
加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些 ...
- java aes_cbc_256 加密解密
在之前我们在openssl上和ios上分别测试了 AES256位cbc模式的加密和解密 今天用java提供的api来测试一下:进而确定一下在PC,iOS,安卓上三个平台下的加密解密数据: 1. 首先通 ...
随机推荐
- pyhton 的i/o流和文件操作
Python 文件I/O 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式.此函数把你传递的表达式转换成一个字符串表达式,并将结果写到标准输出如下: #!/u ...
- [Xcode 实际操作]六、媒体与动画-(5)使用CoreImage框架给图片添加马赛克效果
目录:[Swift]Xcode实际操作 本文将演示如何使用CoreImage图像处理框架,给图片添加像素化的滤镜效果. 在项目导航区,打开视图控制器的代码文件[ViewController.swift ...
- ajax异步传输数据,return返回值为空
今天在项目中遇到了一个问题,就是在定义了一个函数drawHtml(),本意是想在函数运行结束后,返回拼接的字符串,可是函数运行结束后始终返回的是undefined 有BIG的代码: function ...
- GFS安装
GlusterFS 搭建 1.环境要求 IP地址 主机名称 系统 172.16.2.201 test01 Centos 6.4 172.16.2.202 test02 Centos 6.4 172.1 ...
- VxWorks实验六 基于优先级的抢占式调度及实验的源程序和实验步骤
基于优先级的抢占式调度及实验的源程序和实验步骤 1 实验目的 1.学习并验证基于优先级的抢占式调度2 实验内容 在实验一建立的 project 中,创建3 个任务,对这三个任务使用基于优先 ...
- Uva11134
#include<bits/stdc++.h> #define inf 0x3f3f3f3f ; using namespace std; int n; struct rook{ int ...
- 对jvm虚拟机 内存溢出的思考
java内存溢出:当新产生对象时,新生代空间不够,导致无法申请到足够的空间,报内存溢出 内存泄漏:一些静态集合,静态常量没有被gc清理,越来越多,占用内存,最后导致无法申请到新的空间
- WPF 模拟Button按钮事件触发
this.Submit.AddHandler(Button.ClickEvent, new RoutedEventHandler(this.Submit_Click)); //这种是无效的方法 thi ...
- 关于office转换成pdf组件服务中的DCOM配置问题
在开始->运行 中录入“dcomcnfg” 单击“确定”后弹出“组件服务”窗口 依次选择“组件服务”->“计算机”->“我的电脑”->“DCOM配置” 在“DCOM配置”下找到 ...
- SQL2000,2005,2008安装在一台机子上
工欲善其事,必先利其器.本机的系统是在网上自己下载的,是32位windows7旗舰版.因为学习,需要在一台机子上同时安装SQL Server2000,2005,2008三个版本的数据库.先是在网上查了 ...