License java

5234 단어
더 읽 기

public abstract class MyRSACoder {
	public static final String KEY_ALGORITHM = "RSA";
	public static final String KEY_PROVIDER = "BC";
	public static final String SIGNATURE_ALGORITHM = "SHA1WithRSA";

	/**
	 *       
	 */
	public static Map initKeys(String seed) throws Exception {
		
		Map keyMap = new HashMap();
		Security.addProvider(new BouncyCastleProvider());
		KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM,KEY_PROVIDER);
		
		keyPairGenerator.initialize(1024,new SecureRandom(seed.getBytes()));
		KeyPair pair = keyPairGenerator.generateKeyPair();
		RSAPublicKey rsaPublicKey = (RSAPublicKey) pair.getPublic();
		RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) pair.getPrivate();
		
		KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM,KEY_PROVIDER);
		RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(rsaPublicKey.getModulus().toString()),new BigInteger(rsaPublicKey.getPublicExponent().toString()));
		RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(rsaPrivateKey.getModulus().toString()),new BigInteger(rsaPrivateKey.getPrivateExponent().toString()));
		
		PublicKey publicKey = factory.generatePublic(pubKeySpec);
		PrivateKey privateKey = factory.generatePrivate(priKeySpec);

		System.out.println("  :" + pubKeySpec.getModulus() + "----" + pubKeySpec.getPublicExponent());
		System.out.println("  :" + priKeySpec.getModulus() + "----" + priKeySpec.getPrivateExponent());
		keyMap.put("publicKey", publicKey);
		keyMap.put("privateKey", privateKey);
		
		return keyMap;
	}
	
	/**
	 *     
	 * */
	public static byte[] encryptRSA(byte[] data,PrivateKey privateKey) throws Exception {
		
		Cipher cipher = Cipher.getInstance(KEY_ALGORITHM,KEY_PROVIDER);
		cipher.init(Cipher.ENCRYPT_MODE, privateKey);
		int dataSize = cipher.getOutputSize(data.length);
		int blockSize = cipher.getBlockSize();
		int blockNum = 0;
		if (data.length % blockSize == 0) {
			blockNum = data.length / blockSize;
		} else {
			blockNum = data.length / blockSize + 1;
		}
		byte[] raw = new byte[dataSize * blockNum];
		int i = 0;
		while (data.length - i * blockSize > 0) {
			if (data.length - i * blockSize > blockSize) {
				cipher.doFinal(data, i * blockSize, blockSize, raw, i * dataSize);
			} else {
				cipher.doFinal(data, i * blockSize, data.length - i * blockSize, raw, i * dataSize);
			}
			i++;
		}
		
		return raw;
	}
	
	/**
	 *       
	 * */
	public static String sign(byte[] encoderData,PrivateKey privateKey) throws Exception {
		
		Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM,KEY_PROVIDER);
		sig.initSign(privateKey);
		sig.update(encoderData);
		
		return new String(Base64.encode(sig.sign()));
	}
	
	/**
	 *       
	 * */
	public static boolean verify (byte[] encoderData,String sign,PublicKey publicKey) throws Exception {
		
		Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM,KEY_PROVIDER);
		sig.initVerify(publicKey);
		sig.update(encoderData);
		
		return sig.verify(Base64.decode(sign));
	}

main

public class MyRSACoderTest {

	public static void main(String[] args) throws Exception {
		
		Map keyMap = MyRSACoder.initKeys("0");
		PublicKey publicKey = (PublicKey) keyMap.get("publicKey");
		PrivateKey privateKey = (PrivateKey) keyMap.get("privateKey");
		
		String str = "  !";
		byte[] encoderData = MyRSACoder.encryptRSA(str.getBytes(), privateKey);
		String sign = MyRSACoder.sign(encoderData, privateKey);
		boolean status = MyRSACoder.verify(encoderData, sign, publicKey);
		
		System.out.println("  :" + str);
		System.out.println("  :" + new String(encoderData));
		System.out.println("  :" + sign);
		System.out.println("    :" + status);
	}
}

자바 에서 공개 키 암호 화 비밀 키 복호화 원 리 를 사용 하여 license 통 제 를 실현 합 니 다.
현재 많은 J2EE 응용 프로그램 은 하나의 license 파일 로 시스템 의 사용 을 권한 을 부여 한다. 특히 시스템 구 매 초기 에 제 한 된 license 파일 을 제공 하여 시스템 에 대해 제한 을 할 것 이다. 예 를 들 어 시용 판 은 IP, 날짜, 최대 사용자 수의 제한 등 이 있다.그리고 license 제어 방법 도 많 습 니 다. 현재 유행 하고 있 습 니 다. 디자인 만 잘 하면 풀기 어 려 운 방법 은 한 쌍 의 밀 스푼 (밀 스푼 암호 화 된 밀 스푼 복호화) 으로 License 파일 의 Sinature 서명 내용 을 만 들 고 Base 64 나 Hex 를 통 해 인 코딩 하 는 것 입 니 다.예 를 들 어 원래 BEA 회사 가 현재 Oracle 회사 의 WebLogic 인 데 이런 방법 으로 License 파일 을 설정 합 니 다. 
여 기 는 비교적 간단 한 실현 만 진행 합 니 다. 
모두 세 가지 종류 가 있 습 니 다. 
A. KeyGenerator 클래스 생 성 공개 키 비밀 키 쌍 
B. Signaturer 클래스 는 비밀 키 를 사용 하여 서명 합 니 다. 
C. SignProvider 클래스 용 공개 키 검증

좋은 웹페이지 즐겨찾기