1)
취약한 암호화 알고리즘 사용
정보보호 측면에서 취약하거나 위험한 암호화 알고리즘을 사용해서는
안 된다. 표준화되지 않은 암호 알고리즘을 사용하는 것은 공격자가 알고리즘을 분석하여 무력화시킬 수
있는 가능성을 높일 수도 있다. 몇몇 오래된 암호 알고리즘의 경우는 컴퓨터의 성능이 향상됨에 따라 취약해지기도
해서, 예전에는 해독하는데 몇 십 억년이 걸리던 알고리즘이 최근에는 며칠이나 몇 시간 내에 해독되기도
한다. RC2, RC4, RC5, RC6, MD4, MD5, SHA1, DES 알고리즘이 여기에 해당된다.
n 안전한 코딩
기법
① 검증된
표준화된 알고리즘을 사용한다. 기존에 취약하다고 알려진 DES,
RC5등의 암호알고리즘을 대신하여, 3DES, AES, SEED 등의 안전한 암호알고리즘으로
대체하여 사용한다. 또한 업무관련 내용, 개인정보 등에 대한
암호 알고리즘 적용시, IT보안인증 사무국이 안정성을 확인한 검증필 암호모듈을 사용해야한다.
1. public String encryptSHA256(String str) {
2. String SHA = "";
3.
4. try {
5. MessageDigest msgDigest = MessageDigest.getInstance("SHA-256");
6. msgDigest.update(str.getBytes());
7. byte byteData[] = msgDigest.digest();
8.
9. StringBuffer sb = new StringBuffer();
10. for(int i=0; i < byteData.length; i++) {
11. sb.append(Integer.toString((byteData[i]&0xff) + 0x100, 16).substring(1));
12. }
13. SHA = sb.toString();
14.
15. }catch (NoSuchAlgorithmException e) {
16. System.out.println("error");
17. SHA = "";
18. }
19.
20. return SHA;
21. }
1. import java.security.InvalidAlgorithmParameterException;
2. import java.security.InvalidKeyException;
3. import java.security.NoSuchAlgorithmException;
4.
5. import javax.crypto.BadPaddingException;
6. import javax.crypto.Cipher;
7. import javax.crypto.IllegalBlockSizeException;
8. import javax.crypto.NoSuchPaddingException;
9. import javax.crypto.SecretKey;
10. import javax.crypto.spec.IvParameterSpec;
11. import javax.crypto.spec.SecretKeySpec;
12.
13. import org.apache.commons.codec.binary.Base64;
14.
15. public class AES256Cipher {
16.
17. private static volatile AES256Cipher INSTANCE;
18.
19. final static String secretKey = "12345678901234567890123456789012"; // 32 bit
20. static String IV = ""; // 16bit
21.
22. public static AES256Cipher getInstance() {
23. if (INSTANCE == null) {
24. synchronized (AES256Cipher.class) {
25. if (INSTANCE == null)
26. INSTANCE = new AES256Cipher();
27. }
28. }
29. return INSTANCE;
30. }
31.
32. private AES256Cipher() {
33. IV = secretKey.substring(0, 16);
34. }
35.
36. public static String encryptAES256(String str)
37. throws java.io.UnsupportedEncodingException,
38. NoSuchAlgorithmException, NoSuchPaddingException,
39. InvalidKeyException, InvalidAlgorithmParameterException,
40. IllegalBlockSizeException, BadPaddingException {
41. byte[] keyData = secretKey.getBytes();
42.
43. SecretKey secureKey = new SecretKeySpec(keyData, "AES");
44.
45. Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
46. c.init(Cipher.ENCRYPT_MODE, secureKey,
47. new IvParameterSpec(IV.getBytes()));
48.
49. byte[] encrypted = c.doFinal(str.getBytes("UTF-8"));
50. String enStr = new String(Base64.encodeBase64(encrypted));
51.
52. return enStr;
53. }
54.
55. public static String decryptAES256(String str)
56. throws java.io.UnsupportedEncodingException,
57. NoSuchAlgorithmException, NoSuchPaddingException,
58. InvalidKeyException, InvalidAlgorithmParameterException,
59. IllegalBlockSizeException, BadPaddingException {
60. byte[] keyData = secretKey.getBytes();
61. SecretKey secureKey = new SecretKeySpec(keyData, "AES");
62. Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
63. c.init(Cipher.DECRYPT_MODE, secureKey,
64. new IvParameterSpec(IV.getBytes("UTF-8")));
65.
66. byte[] byteStr = Base64.decodeBase64(str.getBytes());
67.
68. return new String(c.doFinal(byteStr), "UTF-8");
69. }
70. }
댓글 없음:
댓글 쓰기